解題思路
採用力扣上給出的方法五 滑動窗口
注意點
如果採用數組的方式存儲每個字母出現的頻率會出現錯誤,這道題目這裏有坑,我剛開始採用的是數組存,本地可以過,但是交上去不能過
代碼如下,本機沒問題,交上去就是錯,經過PlayGround我發現,本應輸入的字符串爲s1=“ab”,s2=“eidbaooo”,變成了圖中所示樣子
class solution {
public:
bool checkinclusion(string s1, string s2) {
int s1map[26];
int s2map[26];
if (s1.length() > s2.length()) return false;//s1的長度大於s2,說明s2不會包含s1
for (int i=0;i<s1.length();i++)
{
s1map[s1[i] - 'a']++;//獲取第i給元素出現的頻率
s2map[s2[i] - 'a']++;
}
for (int i=0;i<s2.length()-s1.length();i++)
{
if (matches(s1map,s2map))
{
return true;//如果出現頻率一樣,說明含有
}
s2map[s2[i + s1.length()] - 'a']++;//將新的後續字符添加到所需考慮的新窗口中
s2map[s2[i] - 'a']--;//去除窗口的第i個字符
}
return matches(s1map,s2map);
}
bool matches(int s1map[], int s2map[])//判斷窗口內的元素出現頻率是否一樣
{
for (int i=0;i<26;i++)
{
if (s1map[i]!=s2map[i])
{
return false;
}
}
return true;
}
};
代碼
該代碼爲通過代碼
class Solution {
public:
bool checkInclusion(string s1, string s2) {
vector<int> s1map(26);
vector<int> s2map(26);
if (s1.length() > s2.length()) return false;//s1的長度大於s2,說明s2不會包含s1
for (int i = 0; i < s1.length(); i++)
{
s1map[s1[i] - 'a']++;//獲取第i給元素出現的頻率
s2map[s2[i] - 'a']++;
}
for (int i = 0; i < s2.length() - s1.length(); i++)
{
if (s1map==s2map)
{
return true;//如果出現頻率一樣,說明含有
}
s2map[s2[i + s1.length()] - 'a']++;//將新的後續字符添加到所需考慮的新窗口中
s2map[s2[i] - 'a']--;//去除窗口的第i個字符
}
return s1map == s2map;
}
};