首页 > 其他分享 >leetcode每日一题day15(24.9.25)——公司命名

leetcode每日一题day15(24.9.25)——公司命名

时间:2024-09-26 14:22:12浏览次数:3  
标签:25 26 后缀 24.9 int long day15 字串 size


思路:首先如果没有相同的后缀,则无论只要不是相同的首字母交换都不会出现重复情况,如果有重复后缀,则还需多增加个不能和,首字符与另一相同后缀字串的首字符相同的字串交换。

主要矛盾已经明确,则可对矛盾进行分析。 首先把范围缩小到只有两种不同首字母,对于这种情况

        如果首字符相同                           肯定是0

        如果没有相同后缀的情况,        为字母A开头字串集合.size() x 字母B开头字串集合.size()

        如果有相同后缀的情况下           (A开头字串集合.size()-有相同后缀的字串数) x(B开头字串集合.size()-有相同后缀的字串数)       

因为一旦对有相同的后缀字符进行替换后,必定会重复,所有等同于没有这个字母


基于上述:扩展到26种首字符也相同,只是需要遍历所有组合即可

方案一:按首字母进行分组

        分组完成即可遍历所有组合进行计算

class Solution {
public:
    long long distinctNames(vector<string>& ideas) {
        unordered_set<string> rec[26];
        for (auto& s : ideas) {
            rec[s[0] - 'a'].insert(s.substr(1));
        }
        //分组完成
        long long ans = 0;
        for (int a = 1; a < 26; a++) {
            for (int b = 0; b < a; b++) {//遍历所有组合
                int m = 0;
                for (auto& s : rec[a]) {//如果有重复的累计一下
                    m += rec[b].count(s);
                }
                ans += (long long) (rec[a].size() - m) * (rec[b].size() - m);
            }
        }
        return ans * 2; //反转也算一次
    }
};

方案二:按后缀进行分组

        按后缀也是同样的道理,但可使用位运算存储一个后缀,所有的全部首字母,并且优化结构,把时间均摊到,初始化阶段,时间复杂度有所降低。

long long distinctNames(vector<string>& ideas) {
        int size[26]{}; 
        int intersection[26][26]{}; 
        unordered_map<string, int> groups; 
        for (auto& s : ideas) {
            int b = s[0] - 'a';
            size[b]++; 
            auto suffix = s.substr(1);
            int mask = groups[suffix];
            groups[suffix] = mask | 1 << b; 
            for (int a = 0; a < 26; a++) { 
                if (mask >> a & 1) { 
                    intersection[b][a]++;
                    intersection[a][b]++;
                }
            }
        }

        long long ans = 0;
        for (int a = 1; a < 26; a++) { 
            for (int b = 0; b < a; b++) {
                int m = intersection[a][b];
                ans += (long long) (size[a] - m) * (size[b] - m);
            }
        }
        return ans * 2; 
    }

标签:25,26,后缀,24.9,int,long,day15,字串,size
From: https://blog.csdn.net/qq_54433947/article/details/142553148

相关文章

  • 20240924_052514 c语言 运算符的优先级
    优先级练习习题......
  • 2024.9.25 Python,单词替换,优美的排列 II,sort的用法前K个高频单词,广度优先搜索腐烂的橘
    1.单词替换在英语中,我们有一个叫做词根(root)的概念,可以词根后面添加其他一些词组成另一个较长的单词——我们称这个词为衍生词(derivative)。例如,词根help,跟随着继承词“ful”,可以形成新的单词“helpful”。现在,给定一个由许多词根组成的词典dictionary和......
  • 20240924_032514 c语言 三元运算符
    用法示例......
  • 20240924_042514 c语言 逗号分隔符
    用法示例习题......
  • 网络安全C10-2024.9.21-burpsuite安装使用过程
    1、安装burp,分别在本机上实现全局代理和局部代理,提供设置过程的说明文档;确认burpsuite监听地址和端口:全局代理:全局上网生效,设备--->网络和Internet--->开启“使用代理服务器” 局部代理:仅浏览器生效,使用firefox浏览设置2、利用burp实现对https站点的抓包;启用第1题代理配......
  • 20240924_012514 c语言 逻辑运算符
    逻辑运算符练一练应用场景演练演练......
  • 20240924_022514 c语言 逻辑短路
    关于短路实例不存在的用户名练习......
  • 20240925
    2集合間距離有两种方法,我选择了更劣的做法,呜呜呜!我是暴力枚举每个点,然后对与另一个集合里的点枚举横坐标,用二分找到纵坐标上距离最小的点,\(xhr\)写的是直接多源广搜,我的时间复杂度为\(O(n*1000)\),他的时间复杂度为\(O(n)\),在线膜拜#include<bits/stdc++.h>usin......
  • 2535. 数组元素和与数字和的绝对差
    给你一个正整数数组nums。元素和是nums中的所有元素相加求和。数字和是nums中每一个元素的每一数位(重复数位需多次求和)相加求和。返回元素和与数字和的绝对差。注意:两个整数x和y的绝对差定义为|x-y|。示例1:输入:nums=[1,15,6,3]输出:9解释:nums的元......
  • 2024.9.25训练记录
    上午whk下午noip模拟T1:结论题。考场想不出来。只需要顺序做第一个1前的数。原因:考虑三个数时的情况。顺序是\((a^b)^c\)或者\(a^{(b^c)}\)。相当于,比较\(b^c\)和\(bc\)的大小。显然有:\(b,c\geq2\)时,\(b^c\geqbc\)。所以按照正常顺序做,在\(A_i\geq2\)时......