cocobear9  
一枚普通的zisuer(lll¬ω¬),努力每天多学一点点

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

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

 

示例 1:

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

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

就是这几个串的交集。

链接:https://leetcode-cn.com/problems/find-common-characters

我们知道第一个字符串的字符数量列表为:

b 1
e 1
l 2
a 1

第二个字符串的字符数量列表为:

l 2
a 1
b 1
e 1

第三个字符串的字符数量列表为:

r 2
o 1
l 2
e 1

这三个求交集后的结果为:

e 1
l 2

结果一目了然。

分析到这里其实也没啥好说的了,我们可以用hashmap来表示**字符-数量**之间的关系,但是考虑到效率的问题,我们可以使用数组来对代码进行优化。用数组res的下标i表示是哪个字符,用res[i]表示该字符出现的次数。代码如下:

public static List<String> commonChars(String[] A) {
        List<String> list = new ArrayList<>();
        int [] res = new int[26];
        for(char c :A[0].toCharArray()) {
            res[c-'a']++;
        }
        for(int i=1;i<A.length;i++) {
            int []arr = new int[26];
            for(char c:A[i].toCharArray()) {
                arr[c-'a']++;
            }
            for(int j=0;j<arr.length;j++) {
                res[j]=Math.min(res[j], arr[j]);
            }
        }
        for(int i=0;i<res.length;i++) {
            if(res[i]>0) {
                for(int j=0;j<res[i];j++) {
                    list.add( (char)(i+'a')+""  ) ;
                }
            }
        }
        return list;
    }

 

posted on 2020-05-27 15:01  cocobear9  阅读(202)  评论(0)    收藏  举报