加载中...

算法题解---字符串分组递推

题目

公司命名

思路

  1. 将所有后缀分成不同的组,利用int 存储每个字母的首字母,状态压缩==> t|=1<<(s[0]-'a');
  2. 递推,cnt[26][26],i,j,cnt[i][j]表示前面的组中 没有i 有j的个数
  3. 遍历所有组,如果组中有i字母,而没有j字母既可以增加数值
  4. 如果组中没有i字母,但是有j字母,可以为后续的组添加不同的次数

代码

class Solution {
public:
    long long distinctNames(vector<string> &ideas) {
        unordered_map<string, int> group;
        for (auto &s : ideas)
            group[s.substr(1)] |= 1 << (s[0] - 'a');
        long ans = 0L;
        int cnt[26][26]; memset(cnt, 0, sizeof(cnt));
        for (auto &[_, mask] : group)
            for (int i = 0; i < 26; i++)
                if ((mask >> i & 1) == 0) {
                    for (int j = 0; j < 26; j++)
                        if (mask >> j & 1) ++cnt[i][j];
                } else {
                    for (int j = 0; j < 26; j++)
                        if ((mask >> j & 1) == 0) ans += cnt[i][j];
                }
        return ans * 2;
    }
};
posted @ 2022-06-12 17:48  lxp_blog  阅读(31)  评论(0编辑  收藏  举报