1002. 查找常用字符

势如破雾 发布于 2025-08-09 108 次阅读


题目

给你一个字符串数组 words ,请你找出所有在 words 的每个字符串中都出现的共用字符(包括重复字符),并以数组形式返回。你可以按 任意顺序 返回答案。

示例 1:

输入:words = ["bella","label","roller"]
输出:["e","l","l"]

示例 2:

输入:words = ["cool","lock","cook"]
输出:["c","o"]

提示:

  • 1 <= words.length <= 100
  • 1 <= words[i].length <= 100
  • words[i] 由小写英文字母组成

题解

题目说words[i]只由小写英文字母组成,这种条件适合用数组来表示哈希表。每一个字符串用一个record[26]来记录,0~25表示a~z。record初始化为0,按照字符串中字母计数。然后全部放入后,纵向比较,若纵向出现0则直接continue,若都不为0则选出最小值,然后放入vector中。全部遍历完后返回vector。

时间复杂度:O(n)

空间复杂度:O(n)

    vector<string> commonChars(vector<string>& words) {
        int records[words.size()][26];
        for(int i=0;i<words.size();i++){
            for(int j=0;j<26;j++){
                records[i][j]=0;
            }
        }
        int i=0;
        for(string s:words){
            for(char c:s){
              records[i][c-'a'] ++;
            }
            i++;
        }
        vector<string> result;
        for(int i=0;i<26;i++){
            int min=200;
            int flag=0;
            for(int j=0;j<words.size();j++){
                if(records[j][i]==0) {
                    flag=1;
                    break;
                }
                else if(records[j][i]<min)
                    min=records[j][i];
            }
            if(flag==1)
                continue;
            else{
                for(int k=0;k<min;k++) {
                    string temp(1, 'a' + i);
                    result.push_back(temp);
                }
            }
        }
        return result;
    }
研究生在读,喜欢尝试新鲜事物,学习技术。爱好跑步,拳击,爬山。
最后更新于 2025-08-09