
- 方法一:计数
- 时间复杂度:O(n(m+∣Σ∣)),其中 n 是数组 A 的长度(即字符串的数目),m 是字符串的平均长度,Σ 为字符集,在本题中字符集为所有小写字母,∣Σ∣=26。
- 遍历所有字符串并计算 \textit{freq}freq 的时间复杂度为 O(nm)O(nm);
- 使用freq 更新minfreq 的时间复杂度为O(n∣Σ∣);
- 由于最终答案包含的字符个数不会超过最短的字符串长度,因此构造最终答案的时间复杂度为 O(m+∣Σ∣)。这一项在渐进意义上小于前二者,可以忽略。
- 空间复杂度:O(∣Σ∣),这里只计算存储答案之外的空间。我们使用了数组freq 和 minfreq,它们的长度均为∣Σ∣。
class Solution {
public List<String> commonChars(String[] A) {
int[] minfreq = new int[26];
Arrays.fill(minfreq, Integer.MAX_VALUE);
for (String word: A) {
int[] freq = new int[26];
int length = word.length();
for (int i = 0; i < length; ++i) {
char ch = word.charAt(i);
++freq[ch - 'a'];
}
for (int i = 0; i < 26; ++i) {
minfreq[i] = Math.min(minfreq[i], freq[i]);
}
}
List<String> ans = new ArrayList<String>();
for (int i = 0; i < 26; ++i) {
for (int j = 0; j < minfreq[i]; ++j) {
ans.add(String.valueOf((char) (i + 'a')));
}
}
return ans;
}
}
来源:力扣(LeetCode)