LeetCode:1002.查找常用字符

题目:

给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。

你可以按任意顺序返回答案。

示例 1:

输入:["bella","label","roller"]
输出:["e","l","l"]
示例 2:

输入:["cool","lock","cook"]
输出:["c","o"]

源码:

class Solution {
    public List<String> commonChars(String[] A) {
        List<String> list = new ArrayList<>();
        // 利用26容量的整数数组来存取字符串的字母
        int[] num = new int[26];
        for (char c : A[0].toCharArray()) {
            // 先保存第一个字符串的字母下标
            // 该字母减去 'a' 就是对应的字母下标
            // 例如'b'-'a'==1表示 'b' 在整数数组的出现位置为 num[1]
            num[c - 'a']++;
        }
        for (int i = 1; i < A.length; i++) {
            // 和上面整数数组一样,保存A[i]的字母下标
            int[] tmp = new int[26];
            for (char x : A[i].toCharArray()) {
                tmp[x - 'a']++;
            }
            // 进行筛选,将两个数组下标下最小值赋值给 num 数组
            // 该操作表示所有字符串中都有出现的字母的最小次数
            for (int j = 0; j < 26; j++) {
                num[j] = Math.min(num[j], tmp[j]);
            }
        }
        // 最后将 num 数组的每个下标下的字母数量添加到 list 之中
        // 例如 num[2] = 2,表述所有字符串中 'c' 字母出现的公共次数为2
        // 就往 list 中添加 2 个 'c'
        for (int i = 0; i < 26; i++) {
            if (num[i] > 0) {
                for (int j = 0; j < num[i]; j++) {
                    list.add(((char)('a' + i) + ""));
                }
            }
        }
        return list;
    }
}
发布了340 篇原创文章 · 获赞 2 · 访问量 8225

猜你喜欢

转载自blog.csdn.net/qq_45239139/article/details/104080517