
这道题要找出所有字符串中的交集字母,最简单你也得全部遍历一遍才可以,所以这道题的时间复杂度至少为O(MN),M为字符串个数,N为字符串平均长度。
但是除此之外,字母共有26个,所以最小的时间复杂度应为O(M(N+|e|)),|e|为字符个数,此处为26。
我们将每个字符串都遍历一遍,并将其中的字母进行计数排序,每遍历完一个字符串后,我们还要去汇总总的26个字母目前分别出现的最小次数。当字符串全部遍历完成后,根据26个字母出现的最小次数,就可以将字母添加进容器中。最后返回容器即可。
class Solution {
public:
vector<string> commonChars(vector<string>& A) {
int l = A.size();
vector<int> ans(26, 100);
vector<string> v;
for(int i = 0; i < l; ++ i) {
int len = A[i].length();
int a[26] = {0};
for(int j = 0; j < len; ++ j)
a[A[i][j] - 'a']++;
for(int i = 0; i < 26; ++ i)
ans[i] = ans[i] < a[i] ? ans[i] : a[i];
}
for(int i = 0; i < 26; ++ i) {
while(ans[i] --) v.emplace_back(1, i + 'a');
}
return v;
}
};

这篇博客探讨了一种寻找多个字符串交集字母的算法,通过计数排序和遍历每个字符串来实现。文章指出,最坏情况下的时间复杂度为O(MN),但通过优化可以达到O(M(N+26))。方法是遍历每个字符串并记录每个字母出现的次数,然后找出所有字符串中每个字母的最小出现次数,最后根据这个最小次数构建交集字母的集合。该算法适用于处理大量字符串的情况。
564

被折叠的 条评论
为什么被折叠?



