查找常用字符
给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,
则需要在最终答案中包含该字符 3 次。
你可以按任意顺序返回答案。
示例 1:
输入:["bella","label","roller"]
输出:["e","l","l"]
示例 2:
输入:["cool","lock","cook"]
输出:["c","o"]
思路:给每组字符串,建立26维度数字,统计a-z出现个个数,最后求a-z的min
对于 ["bella","label","roller"] ,画图 ! ! !
a b .... e ................. l ... o.....r
A[0] 1 1 1 2 0 0
A[1] 1 1 1 2 0 0
A[2] 0 0 1 2 1 1
vector<string> commonChars(vector<string>& A)
{
//每个字符串,申请26长度的数组,统计abcd...出现次数
vector<string> res;
int a[A.size()][26] = {0};//数组初始化列表中的元素个数小于指定的数组长度时,不足的元素补以默认值。对于基本类型int来说,当然就是补int()即0了
for(int i= 0; i< A.size(); i++)
for(int j=0; j< A[i].size(); j++)
{
char k = A[i][j];
a[i][k - 'a'] +=1;
}
// 用min[26] 来记录每一个字母对应A[0],A[1]...的最小值
int min[26];
for(int i=0;i<26;i++)
{
for(int k=0;k<A.size();k++)
{
if(k==0)
min[i] = a[k][i];
else
{
if(min[i]>a[k][i])
min[i] = a[k][i];
}
}
}
// 遍历每一个字符
for(int i=0; i< 26; i++)
{
// 如果最小值不为0 ,说明有公共的字母,将其转换为字符
if(min[i]!=0)
{
stringstream stream;
string st;
for(int k=0;k<min[i];k++)
{
char c = i+'a';
stream.clear();
stream << c;
stream >> st;
res.push_back(st);
}
}
}
return res;
}