题目链接:https://leetcode-cn.com/problems/word-subsets/
刚看完这道题啥也没想就去敲暴力,然后就超时了,暴力的思路就是用每一个A中的字符串去枚举所有的B中的字符串是否是在a中存在,那么其实我们可以想一下如果对于B集合来说,如果"oo"符合要求的话,那么"o"一定符合要求。所以我们就只需要维护一个最大值就好了,这个最大值的意思就是对于B集合中的每一个b字符串,维护一个最大的出现次数就好了。比如["abcc", "caa", bb]中只需要维护mb["a"] = 2;mb["b"] = 2;mb["c"] = 2就好了。
AC代码:
class Solution {
public:
map<char,int> mb;
bool Check(string& str,int& len){
map<char,int> ma;
for(int i=0;i<str.length();i++){
ma[str[i]] ++;
}
for(auto i : mb){
if(ma[i.first] < i.second) return false;
}
return true;
}
vector<string> wordSubsets(vector<string>& A, vector<string>& B) {
int lenA = A.size();
int lenB = B.size();
for(int i=0;i<lenB;i++){
map<char,int> m;
for(int j=0;j<B[i].length();j++){
m[B[i][j]] ++;
mb[B[i][j]] = max(mb[B[i][j]], m[B[i][j]]);
}
}
vector<string> ans;
for(int i=0;i<lenA;i++){
if(Check(A[i], lenB)){
ans.push_back(A[i]);
}
}
return ans;
}
};