LeetCode 1002. 查找共用字符

题目描述

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. 自定义字符串排序 中等 计数
本文作者:
本文链接: https://hgnulb.github.io/blog/2025/86172247
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!