结果
题目如下:
给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。
输入:["bella","label","roller"]
输出:["e","l","l"]
输入:["cool","lock","cook"]
输出:["c","o"]
你可以按任意顺序返回答案。
代码如下:
import java.util.ArrayList;
import java.util.List;
class Solution {
public List<String> commonChars(String[] A) {
List<String> list = new ArrayList<>();
if(A==null || A.length<=0){
return list;
}
int[] chars = new int[26];
for(int i = 0;i < 26;i++){
chars[i] = Integer.MAX_VALUE;
}
for(String str : A){
char[] content = str.toCharArray();
int[] charsTemp = new int[26];
for(char c : content){
charsTemp[c-97]++;
}
for(int i = 0;i < 26;i++){
if(charsTemp[i] < chars[i]){
chars[i] = charsTemp[i];
}
}
}
for(int i = 0;i < chars.length;i++){
for(int k = 0; k < chars[i];k++){
list.add((char) (i+'a')+"");
}
}
return list;
}
}
过程
因为时间原因没有比赛,但是今天看专栏看了看线性排序,里面有一个计数排序用在这个上面感觉很搭,所以试了试。
我先申请了一个代表26个字母的int数组,数组每个元素代表当前字母(index+‘a’)的数量。然后遍历给定的字符串数组,在每一个字符串数组中同样申请一个临时的26个字母的int数组,在对这个字符串的每一个字母遍历后,拿新申请的数组与开始申请的数组对应元素(相同下标)进行比较,如果哪个数字小就用谁(题目要求,如果一个字母在所有字符串出现了至少n次,比如aaab、aaaaac、aad,这里a在每一个字符串里至少出现了2次,所以在int数组‘a’所对应的下标中填2,所以谁小就用谁)。