[头条刷题] 判断一个字符串的组合是否为另一个字符串的子串 leetcode 567
class Solution {
public:
bool checkInclusion(string s1, string s2) {
if(s1.empty()){
return true;
}
if(s2.empty()){
return false;
}
if(s1.size() == 1){
return s2.find(s1) != std::string::npos;
}
if(s1.size() > s2.size()){
return false;
}
std::unordered_map<char, int> umap1;
std::unordered_map<char, int> umap2;
for(auto& c: s1){
umap1[c]++;
}
for(int i = 0; i < s1.size(); i++){
umap2[s2[i]]++;
if(umap1.find(s2[i]) == umap1.end()){
umap1[s2[i]] = 0;
}
}
if (umap1 == umap2){
return true;
}
for(int i = s1.size(); i < s2.size(); i++){
int left = i - s1.size();
umap2[s2[left]]--;
umap2[s2[i]]++;
if(umap1.find(s2[i]) == umap1.end()){
umap1[s2[i]] = 0;
}
// print_map(umap1);
// print_map(umap2);
if(umap1 == umap2){
return true;
}
}
return false;
}
};
这种方法比较笨, 就是设定一个窗口, 遍历的时候更新窗口, 判断窗口构成的map是否和查询字符串构成的map一致