• leetcode 1002. 查找共用字符


    2023.9.6

            个人感觉这题难度不止简单,考察到的东西还是挺多的。 首先理解题意,可以将题意转化为:求字符串数组中 各字符串共同出现的字符的最小值。  分为三步做:

    1. 构造一个哈希表hash,初始化第一个字符串的字母出现频率。
    2. 再构造一个哈希表other_hash,用来依次统计后面的字符串中每个字符出现的频率,每个字符串统计完之后和上一个哈希表对比,取频率小的那个值。
    3. 遍历第一个hash表将频率大于0的字符放入ans中。

            代码如下:

    1. class Solution {
    2. public:
    3. vector commonChars(vector& words) {
    4. //本题可以简化为求数组中各字符串共同出现的字符的最小值
    5. vector ans;
    6. int hash[26] = {0};
    7. //初始化第一个字符串的字母出现频率
    8. for(int i=0; i0].size(); i++)
    9. {
    10. hash[words[0][i]-'a'] += 1;
    11. }
    12. int other_hash[26] = {0};
    13. //每个字符串都统计出频率,并和第一个字符串的频率比较,取小的那一个。
    14. for(int i=1; isize(); i++)
    15. {
    16. memset(other_hash , 0 , 26*(sizeof(int))); //重新初始化other_hash数组为全0
    17. for(int j=0; jsize(); j++)
    18. {
    19. other_hash[words[i][j]-'a'] += 1;
    20. }
    21. for(int k=0; k<26; k++)
    22. {
    23. hash[k] = min(hash[k] , other_hash[k]);
    24. }
    25. }
    26. //遍历hash将频率大于0的字符放入ans中
    27. for(int i=0; i<26; i++)
    28. {
    29. string s(1 , 'a'+i);
    30. while(hash[i]--) ans.push_back(s);
    31. }
    32. return ans;
    33. }
    34. };

            ps:有几个点注意下:

    • memset函数: void *memset(void *str, int c, size_t n)  ,用于复制字符 到参数 str 所指向的字符串的前 n 个字符,最后一个参数是这n个字符占的内存大小。 本题用于将other_hash表重新初始化为全0值。
    • string s(1 , 'a'+i): 在结尾遍历hash函数的时候,需要将数字转化为对应的字母,如:0对应a,1对应b。 这里string的用法为:第一个参数代表要创建一个包含一个字符的字符串,第二个参数代表这个字符的值由整数i加上字符 'a' 的ASCII码值决定。
  • 相关阅读:
    JVM内存和垃圾回收-15.垃圾回收器
    C. To Add or Not to Add
    CSS基础详细解析(附带综合小练习)
    tslib库编译与移植
    Related to the third param of function “sort“ & Lambda of Cpp
    K8S部署相关
    MySQL自增主键和手动生成主键区别
    基于Vue+Node+MySQL的美食菜谱食材网站设计与实现
    爬虫HTTP代理:获取多种类型数据的神器
    【S1002基于vue+nodejs的学生竞赛报名管理系统-哔哩哔哩】 https://b23.tv/xhyyT9U
  • 原文地址:https://blog.csdn.net/m0_61028090/article/details/132718401