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

题目

公司命名

思路#

  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 @   lxp_blog  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示
主题色彩