LeetCode#1002 | Nobilta's Blog
0%

LeetCode#1002

LeetCode#1002查找常用字符

题目链接
这道题的题目用人话翻译一下就是给你几个字符串,让你找到在所有字符串中都出现过的字符,如果有一个字符在所有字符串中出现过很多次,不用去重。力扣这个英译汉绝了
先说下我的想法,直接使用标记数组的方式,将每个字符串的字符分别存入map中,如果出现过这个字符,则数量+1,最后再遍历26个字母,逐一访问每个字符串的标记数组,即可获得按照字典序的结果,当然这个方式空间复杂度和时间复杂度都很高。
附代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution {
public:
vector<string> commonChars(vector<string>& A) {
int length = A.size();
vector<map<char,int>>ans;
for(int i = 0 ; i < length ; i++)
{
map<char,int>temp;
for(int j = 0 ;j < A[i].size() ; j++)
temp[A[i][j]]++;
ans.push_back(temp);
}
vector<string>result;
for(int i = 0 ; i < 26 ; i++)
{
int min = 999;
for(int j = 0 ; j < length ; j++)
{
if(ans[j]['a'+i] < min)
min = ans[j]['a'+i];
}
string t;
t.push_back('a'+i);
for(int j = 0 ; j < min ; j++)
{
result.push_back(t);
}
}
return result;
}
};

题解和我思路其实差不多,只不过它是维护了一个最小值数组,每次遍历字符串对它进行更新
(c++11的标准越来越像python了,乍一看差点以为挂错代码了)
附题解代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
public:
vector<string> commonChars(vector<string>& A) {
vector<int> minfreq(26, INT_MAX);
vector<int> freq(26);
for (const string& word: A) {//遍历给定的A容器
fill(freq.begin(), freq.end(), 0);
for (char ch: word) {
++freq[ch - 'a'];//分别记录每个字符串的字符数量
}
for (int i = 0; i < 26; ++i) {//维护记录每个字符最小数量的数组
minfreq[i] = min(minfreq[i], freq[i]);
}
}

vector<string> ans;
for (int i = 0; i < 26; ++i) {
for (int j = 0; j < minfreq[i]; ++j) {
ans.emplace_back(1, i + 'a');
}
}
return ans;
}
};
您的支持将鼓励我继续创作!