Problem:567. 字符串的排列
思路:直接拿一个哈希表记录一下s1字符串各个字母出现的次数,s1的长度记为k,一个简单的思路就是大小为k的滑动窗口维护一下这个窗口内各个字母出现的次数,在和记录的s1各个字母次数比较一下就OK了。
Accode:
class Solution {
public:
bool checkInclusion(string s1, string s2) {
int len_s2 = s2.length(),k = s1.length();
vector<int> cnt_char_s1(26,0),cnt_tmp(26,0);
deque<int> deq;
for(auto item:s1){
cnt_char_s1[item-'a']++;
}
for(int i=0;i<len_s2;i++){
if(deq.size() && i-deq.front()+1>k){
int first = deq.front();
cnt_tmp[s2[first]-'a']--;
deq.pop_front();
}
deq.push_back(i);
cnt_tmp[s2[i]-'a']++;
if(i+1>=k){
bool flag = true;
for(int i=0;i<26;i++){
if(cnt_char_s1[i]!=cnt_tmp[i]){
flag = false;
break;
}
}
if(flag) return true;
}
}
return false;
}
};
时间复杂度:$o(26*n)$