力扣1002. 查找常用字符(哈希)
https://leetcode-cn.com/problems/find-common-characters/
给定仅有小写字母组成的字符串数组 A
,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。
你可以按任意顺序返回答案。
示例 1:
输入:["bella","label","roller"] 输出:["e","l","l"]
示例 2:
输入:["cool","lock","cook"] 输出:["c","o"]
哈希map
【注意】没有char类型直接初始化string的
复杂度分析
-
时间复杂度:O(n(m+∣Σ∣)),其中 n 是数组 A 的长度(即字符串的数目),m 是字符串的平均长度,aΣ 为字符集,在本题中字符集为所有小写字母,∣Σ∣=26。
遍历所有字符串并计算 freq 的时间复杂度为 O(nm);
使用 freq 更新 minfreq 的时间复杂度为 O(n∣Σ∣);
由于最终答案包含的字符个数不会超过最短的字符串长度,因此构造最终答案的时间复杂度为 O(m+∣Σ∣)。这一项在渐进意义上小于前二者,可以忽略。 -
空间复杂度:O(∣Σ∣),这里只计算存储答案之外的空间。我们使用了数组 freq 和 minfreq,它们的长度均为 ∣Σ∣。
#include "stdafx.h"
#include<vector>
#include<iostream>
#include<string>
#include<map>
using namespace std;
class Solution {
public:
vector<string>commonChars(vector<string>&A)
{
vector<string> result;
if (A.size() == NULL) return result;
map<string, int> mp;
for (int i = 0; i < A.size(); i++)
{
string B;
B = A[i];
for (int i = 0; i < B.size(); i++)
{
string temp;
temp = B[i];
mp[temp]++;
}
}
//iterator
for (map<string, int>::iterator i = mp.begin(); i != mp.end(); i++)
{
while (i->second >= 3 && i->second != 4)
{
result.push_back(i->first);
i->second = i->second - 3;
}
}
return result;
}
};
int main()
{
Solution s;
vector<string>A;
A.push_back("acabcddd");
A.push_back("bcbdbcbd");
A.push_back("baddbadb");
A.push_back("cbdddcac");
A.push_back("aacbcccd");
A.push_back("ccccddda");
A.push_back("cababaab");
A.push_back("addcaccd");
auto result = s.commonChars(A);
for (int i = 0; i < result.size(); i++)
{
cout << result[i] << " ";
}
return 0;
}
class Solution {
public:
vector<string> commonChars(vector<string>& A) {
vector<string> ans;
map<char,int>b,c;
for(int i=0;i<A.size();i++){
for(int j=0;j<A[i].size();j++){
b[A[i][j]]++;
//cout<<b[A[i][j]]<<" %";
}
//cout<<endl;
for(int j=0;j<A[0].size();j++){ //相同字符中选出现最小的
if(!i){ //初始化c
c=b;
}
else{
if(c[A[i][j]]&&b[A[i][j]]){
c[A[i][j]]=min(c[A[i][j]],b[A[i][j]]);
//cout<<A[i][j]<<" "<<c[A[i][j]]<<" $";
}
// else{
// c[A[i][j]]=0;
// }
}
}
for(map<char,int>::iterator it=c.begin();it!=c.end();it++){ //不同字符则值置为0
if(!b[it->first]){
it->second=0;
}
}
b.clear(); //重置待比较的
}
for(map<char,int>::iterator it=c.begin();it!=c.end();it++){
while(it->second){
string s(1,it->first); //【注意】没有char类型直接初始化string的
ans.push_back(s);
it->second--;
}
//cout<<it->first<<" "<<it->second;
}
return ans;
}
};