题目
给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。
你可以按任意顺序返回答案。
示例 1:
输入:["bella","label","roller"] 输出:["e","l","l"]
示例 2:
输入:["cool","lock","cook"] 输出:["c","o"]
解题
用minfreq记录每个字符出现的最小频率
tmp记录当前字符串中每个字符的频率,然后用来更新minfreq
python解法
class Solution: def commonChars(self, words: List[str]) -> List[str]: minfreq = [float('inf')]*26 for word in words: tmp = [0]*26 for c in word: tmp[ord(c)-ord('a')]+=1 for i in range(26): minfreq[i] = min(minfreq[i],tmp[i]) res = [] for i in range(26): res.extend([chr(i+ord('a'))]*minfreq[i]) return res
c++解法
class Solution { public: vector<string> commonChars(vector<string>& words) { vector<int> minfreq(26,INT_MAX); for(string word:words){ vector<int> tmp(26,0); for(char c:word){ tmp[c-'a']++; } for(int i=0;i<26;i++){ minfreq[i]=min(minfreq[i],tmp[i]); } } vector<string> res; for (int i = 0; i < 26; ++i) { for (int j = 0; j < minfreq[i]; ++j) { res.emplace_back(1, i + 'a'); } } return res; } };
emplace_back和push_back差别
res.emplace_back(1, i + 'a');
如果使用push_back就要
res.push_back(string(1,i+'a'));
在push_back之前,实例对象就必须要执行构造函数,然后拷贝到容器中再执行一次拷贝构造函数。
但是使用emplace_back以不用执行多余的拷贝构造函数了,它是直接在容器内执行对象的构造。
string
string(1,i+'a')
代表添加1个(i+‘a’)
可以看到 此题的要求返回["e","l","l"]
这种,双引号代表string,每个string只能有一个字符
于是并不能使用res.emplace_back(minfreq[i],i+'a')
其他补充:
java解法
class Solution { public List<String> commonChars(String[] words) { List<String> res=new ArrayList<>(); if(words.length==0) return res; int[] mp=new int[26]; for(int i=0;i<words[0].length();i++){ mp[words[0].charAt(i)-'a']++; } for(int i=1;i<words.length;i++){ int[] tmp=new int[26]; String s=words[i]; for(int j=0;j<s.length();j++){ tmp[s.charAt(j)-'a']++; } for(int j=0;j<26;j++){ mp[j]=Math.min(mp[j],tmp[j]); } } for(int i=0;i<26;i++){ for(int j=0;j<mp[i];j++){ char c=(char)(i+'a'); res.add(String.valueOf(c)); } } return res; } }