题目出自LeetCode 438
这次直接上代码,这个题我理解的不到位,对容器理解的还不好,出了错。不说废话,直接上代码,希望大神给予指点:
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
vector<int>res;//返回的是位置
int m=0,n=0;
m=p.size();
map<char,int>zi,hua;//p中的数据,滑动窗口的数据
for(char& c:p)zi[c]++;//将子串中的数据记录下来;
int right=0,left=0;
int ji=0;//用来计数,检查是否找到了子串中的数据是否找齐了
//开始滑动起来
while(right<s.size()){
char cc=s[right]; //
right++;//移动右窗口,基本的套路就是这样的,先移动右边,满足条件后,开始移动左边;
//检查cc是否在在子串中出现了
if(zi.count(cc)){
//如果出现的话,就将其放入到hua容器中保存
hua[cc]++;
if(hua[cc]==zi[cc])
ji++;//如果zi中和hua中的数据个数相等,就找到了一个数据,反之就没找到,或者当前的数据重复了
}
//开始琢磨左窗口
while(ji==zi.size()){//找到了p中的所有数据
if(right-left==m){
res.push_back(left);
}
char c=s[left];//将当前的左窗口的字符记录下来
left++;
//开始为右窗口的移动做铺垫
if(zi.count(c)){
if(hua[c]==zi[c]){
hua[c]--;
ji--;
}
}
}
}
return res;
// unordered_map<char, int> need, window;
// for (char& cc : p)
// need[cc]++;
// vector<int> res;
// int n = p.size();
// int m = s.size();
// if (m == 0 || m < n)
// return{};
// int left = 0, right = 0;
// int start = 0;
// int vaild = 0, len = INT_MAX;
// while (right < s.size()){
// char cc = s[right];
// right++;
// if (need.count(cc)) //need中包含了cc
// {
// window[cc]++; //窗口添加元素
// if (need[cc] == window[cc])
// vaild++; //效果加1
// }
// while (vaild == need.size()){ //移动左边
// if (right - left == n)
// res.push_back(left);
// char tt = s[left]; //左边的元素
// left++;
// if (need.count(tt)){
// if (window[tt] == need[tt])
// vaild--;
// window[tt]--;
// }
// }
// }
// return res;
}
};
被注释掉的是正确的解法,两个方法的不同之处在于,我用的是map出错了,其他人用的unordered_map
在处理 “baa” “aa”的时候我得方法出错了,另外"abacbabc" “abc” 这种情况也出错了
错误点在于wind[cc]在map和unordered_map中表示的意义不一样,但是怎么不一样我也不知道。希望大神指点…
大意了,不是容器的问题,就是我的代码出错了。。。。。。好粗心,不好意思~~~~》——《