问题
给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。
你可以按任意顺序返回答案。
示例 1:
输入:\(["bella","label","roller"]\)
输出:\(["e","l","l"]\)
示例 2:
输入:\(["cool","lock","cook"]\)
输出:\(["c","o"]\)
提示:
- \(1 <= A.length <= 100\)
- \(1 <= A[i].length <= 100\)
- \(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;
}
}