1002. 查找常用字符
给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。
你可以按任意顺序返回答案。
这道题目刚看到的时候我第一反应是用C++和Python自带的哈希表来做,想讲每个字符串的字符存储在哈希表中,然后进行查找。随后看了答案,被无情打脸了,答案使用的是计数式哈希表。使用数组构建一个字符与出现频次对应的哈希表,每次更新字符串中出现的最小字符。虽然时间复杂度上可能差不多,但是官方给出的答案确实更加的巧妙。下面是参考官方解题思路编写的C++代码:
class Solution {
public:
vector<string> commonChars(vector<string>& A) {
vector<string> result;
if(!A.size()) return result;
int StrSize=A.size();
vector<int> MinFrqMap(26,0);
for(int i=0;i<StrSize;i++)
{
vector<int> FrqMap(26,0);
for(int j=0;j<A[i].length();j++)
{
FrqMap[A[i][j]-'a']+=1;
}
for(int j=0;j<26;j++)
{
if(i==0) MinFrqMap[j]=FrqMap[j];
else MinFrqMap[j]=min(MinFrqMap[j],FrqMap[j]);
}
}
for(int i=0;i<26;i++)
{
for(int j=0;j<MinFrqMap[i];j++)
{
string tmpStr(1,i+'a');
result.push_back(tmpStr);
}
}
return result;
}
};
运行效果:
类似的思路使用Python实现的代码如下:
class Solution:
def commonChars(self, A: List[str]) -> List[str]:
if not A:
return [""]
minFreq=[float("inf")]*26
for Str in A:
charFreq=[0]*26
for ch in Str:
charFreq[ord(ch)-ord('a')]+=1
for i in range(26):
minFreq[i]=min(minFreq[i],charFreq[i])
result=[]
for i in range(26):
result.extend([chr(i+ord('a'))]*minFreq[i])
return result
运行效果:
力扣(LeetCode):链接