我们可以定义两个哈希数组,因为全是小写字母,所以将哈希数组的大小定为26,将第一个存储字符串第一个数组的值,第二个存放第二个数组,并和第一个数组进行比较,值较小的放在第一个数组,将数组二置为0,并且去遍历第三个数组,以此类推,最后第一个数组中的元素就是要求的公共子字符。
代码如下:
class Solution {
public:
vector<string> commonChars(vector<string>& A)
{
vector<string> result;
if (A.size() == 0)
return result;
int hash[26] = {0}; // 用来统计所有字符串里字符出现的最小频率
for (int i = 0; i < A[0].size(); i++)
{ // 用第一个字符串给hash初始化
hash[A[0][i] - 'a']++;
}
int hashOtherStr[26] = {0}; // 统计除第一个字符串外字符的出现频率
for (int i = 1; i < A.size(); i++)
{
memset(hashOtherStr, 0, 26 * sizeof(int));
for (int j = 0; j < A[i].size(); j++)
{
hashOtherStr[A[i][j] - 'a']++;
}
// 更新hash,保证hash里统计26个字符在所有字符串里出现的最小次数
for (int k = 0; k < 26; k++)
{
hash[k] = min(hash[k], hashOtherStr[k]);
}
}
// 将hash统计的字符次数,转成输出形式
for (int i = 0; i < 26; i++)
{
while (hash[i] != 0)
{ // 注意这里是while,多个重复的字符
string s(1, i + 'a'); // char -> string
result.push_back(s);
hash[i]--;
}
}
return result;
}
};