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) { 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; } };
|