LeetCode 1002. 查找共用字符
题目描述
思路分析
解法一:计数取最小值(推荐)
核心思路:
- 统计每个单词的 26 个字母频次。
- 用
minCnt[i]记录所有单词中字符i的最小出现次数。- 最终按最小次数输出字符列表即可。
复杂度分析:
- 时间复杂度:O(S),其中 S 表示所有单词的总长度。
- 空间复杂度:O(1),仅使用固定大小计数数组。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
class Solution {
public List<String> commonChars(String[] words) {
int[] minCnt = new int[26];
Arrays.fill(minCnt, Integer.MAX_VALUE);
// 逐个单词统计频次并更新最小值
for (String word : words) {
int[] cnt = new int[26];
for (char ch : word.toCharArray()) {
cnt[ch - 'a']++;
}
for (int i = 0; i < 26; i++) {
minCnt[i] = Math.min(minCnt[i], cnt[i]);
}
}
List<String> res = new ArrayList<>();
for (int i = 0; i < 26; i++) {
for (int k = 0; k < minCnt[i]; k++) {
res.add(String.valueOf((char) ('a' + i)));
}
}
return res;
}
}
func commonChars(words []string) []string {
minCnt := make([]int, 26)
for i := 0; i < 26; i++ {
minCnt[i] = 1 << 30
}
// 逐个单词统计频次并更新最小值
for _, word := range words {
cnt := make([]int, 26)
for _, ch := range word {
cnt[int(ch-'a')]++
}
for i := 0; i < 26; i++ {
if cnt[i] < minCnt[i] {
minCnt[i] = cnt[i]
}
}
}
res := make([]string, 0)
for i := 0; i < 26; i++ {
for k := 0; k < minCnt[i]; k++ {
res = append(res, string(rune('a'+i)))
}
}
return res
}
相似题目
| 题目 | 难度 | 考察点 |
|---|---|---|
| 242. 有效的字母异位词 | 简单 | 计数 |
| 383. 赎金信 | 简单 | 计数 |
| 567. 字符串的排列 | 中等 | 滑动窗口 |
| 438. 找到字符串中所有字母异位词 | 中等 | 滑动窗口 |
| 791. 自定义字符串排序 | 中等 | 计数 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!