1002. 查找常用字符

2019/07/18 22:17 下午 posted in  leetcode 数组

问题

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

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

示例 1:

输入:\(["bella","label","roller"]\)
输出:\(["e","l","l"]\)

示例 2:

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

提示:

  1. \(1 <= A.length <= 100\)
  2. \(1 <= A[i].length <= 100\)
  3. \(A[i][j]\) 是小写字母

解法

首先需要将每一个字符串进行字母的数量统计。然后遍历数量数组,获取每个字符的最小出现次数,即为答案。
数量统计有多种做法,二维数组、hashmap。此题中使用了二维数组。

代码

java

class Solution {
    public List<String> commonChars(String[] A) {
        //生成一个二维数组用于保存词频
        int[][] array = new int[A.length][26];
        //词频统计
        for (int i = 0; i < A.length; i++) {
            String s = A[i];
            for (char c : s.toCharArray()) {
                array[i][c - 97]++;
            }
        }
        List<String> result = new LinkedList<>();
        for (int i = 0; i < 26; i++) {
            if(array[0][i]==0) {
                continue;
            }
            //得到第一组词频
            int count = array[0][i];
            for (int j = 1; j < A.length; j++) {
                if (array[j][i] == 0){
                    count = 0;
                    break;
                }
                count = Math.min(count, array[j][i]);
            }
            //如果词频大于0,那么加入结果中
            if (count > 0) {
                char c = (char) (97 + i);
                String s = Character.toString(c);
                while (count-- >0) {
                    result.add(s);
                }
            }
        }
        return result;
    }
}