原题链接:https://leetcode-cn.com/problems/find-common-characters/
原题解作者解题链接:https://leetcode-cn.com/problems/find-common-characters/solution/9507-java-by-li-hao-yu-ustc/
题目描述:给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。
你可以按任意顺序返回答案。
例:
输入:[“bella”,“label”,“roller”]
输出:[“e”,“l”,“l”]
思路: 因为字符串数组存储的都是由小写字母组成,我们可以创建一个长度为 26 的 int 类型数组
ans,来保存每个字符串都显示的字符,其中数组下标为字符,数组的值代表该字符出现的次数。然后遍历字符串数组,用 tep
数组记录当前字符串中每个字符出现的次数,遍历完当前字符串后,再比较 tep 数组(保存当前字符串每个字符出现的次数)和 ans
数组(保存当前字符串之前的字符串都出现的字符的次数)的值,二者取较小者。最后遍历 ans
数组将下标和数组的值都转换成具体的字符即可。具体代码如下:
代码:
class Solution {
public List<String> commonChars(String[] A) {
//创建一个数组来保存每个字符串都显示的字符
//其中下标代表字符,数组的值代表出现的次数。
int [] ans = new int[26];
for (int i = 0; i < 26; i++) {
//先把数组的值都初始化为 Integer.MAX_VALUE,方便后序操作。
ans[i] = Integer.MAX_VALUE;
}
// 遍历字符串数组
for (String str : A) {
//tep 数组用来记录每个字符串的字符出现的次数。
int [] tep = new int[26];
for (int i = 0; i < 26; i++) {
tep[i] = 0;
}
//遍历字符串的每一个字符
for (char c : str.toCharArray()) {
tep[c - 'a']++;
}
//更新 ans 数组的值,因为是每个字符串都出现的字符,
//因此在 ans[i] 和 tep[i] 中取两者中较小者
//ans[i] 代表前面的字符串都显示此字符的次数,
//tep[i] 代表当前字符串出现此字符的次数。
for (int i = 0; i < 26; i++) {
ans[i] = Math.min(ans[i], tep[i]);
}
}
//用 List 集合保存最终结果。
List<String> list = new ArrayList<>();
//遍历保存最终结果的 ans 数组
for (int i = 0; i < 26; i++) {
//当前字符出现的次数大于 0 时就插入到 List 集合中。
while (ans[i] > 0) {
//需要先根据 ans 数组的下标转换成对应的字符
list.add("" + (char)('a' + i));
//添加后,该字符在最终结果的数组中的值就减一。
ans[i]--;
}
}
return list;
}
}