滑动窗口

题目出自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中表示的意义不一样,但是怎么不一样我也不知道。希望大神指点…

大意了,不是容器的问题,就是我的代码出错了。。。。。。好粗心,不好意思~~~~》——

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值