难度:简单
给你一个字符串数组 words
,请你找出所有在 words
的每个字符串中都出现的共用字符( 包括重复字符),并以数组形式返回。你可以按 任意顺序 返回答案。
输入:words = [“bella”,“label”,“roller”]
输出:[“e”,“l”,“l”]
输入:words = [“cool”,“lock”,“cook”]
输出:[“c”,“o”]
提示:
1 <= words.length <= 100
1 <= words[i].length <= 100
words[i]
由小写英文字母组成“小写英文字母“,“出现频率”, 这些关键字都是为 哈希法 量身定做的!!!
hash
数组进行初始化,Java
class Solution {
public List<String> commonChars(String[] words) {
List<String> ans = new ArrayList<>();
int[] hash = new int[26];
for(char c : words[0].toCharArray()){//用第一个字符串给hash数组初始化
hash[c - 'a']++;
}
int[] hashOther = new int[26];
for(int i = 1; i < words.length; i++){
Arrays.fill(hashOther, 0);//重置为0
for(char c : words[i].toCharArray()){//统计剩余字符串中每个字符数量
hashOther[c - 'a']++;
}
//对比26个字符,取最小值
for(int j = 0; j < 26; j++){
hash[j] = Math.min(hash[j], hashOther[j]);
}
}
for(int i = 0; i < 26; i++){//将字符转换为String型
while(hash[i] > 0) {
ans.add(String.valueOf((char)('a' + i)));
hash[i]--;
}
}
return ans;
}
}
C++
class Solution {
public:
vector<string> commonChars(vector<string>& words) {
vector<string> ans;
int hash[26] = {0};
for(char c : words[0]){//用第一个字符串给hash数组初始化
hash[c - 'a']++;
}
int hashOther[26] = {0};
for(int i = 1; i < words.size(); i++){
memset(hashOther, 0, 26 * sizeof(int));//重置为0
for(char c : words[i]){//统计剩余字符串中每个字符数量
hashOther[c - 'a']++;
}
//对比26个字符,取最小值
for(int j = 0; j < 26; j++){
hash[j] = min(hash[j], hashOther[j]);
}
}
for(int i = 0; i < 26; i++){//将字符转换为string型
while(hash[i]--) {
ans.push_back(string(1, i + 'a'));
}
}
return ans;
}
};
时间复杂度: O ( n ( m + ∣ Σ ∣ ) ) O(n(m+∣Σ∣)) O(n(m+∣Σ∣)),其中 n
是数组 words
的长度(即字符串的数目),m
是字符串的平均长度, Σ \Sigma Σ 为字符集,在本题中字符集为所有小写字母, ∣ Σ ∣ = 26 |\Sigma|=26 ∣Σ∣=26。
空间复杂度: O ( ∣ Σ ∣ ) O(∣\Sigma∣) O(∣Σ∣),这里只计算存储答案之外的空间。我们使用了数组 hash
和 hashOther
,它们的长度均为 ∣ Σ ∣ |\Sigma| ∣Σ∣ ,这里为 26。
题目来源:力扣。
放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我LeetCode主页 / CSDN—力扣专栏,每日更新!