滑动窗口通用解leetcode字符串匹配问题

滑动窗口,这玩意解决一些字符串匹配的题目是真的挺好用的,虽然本质还是双指针。


思路:

1.维护一个窗口,不断的向右边移动
2.满足要求后,移动左边,当不满足时,跳出。
3.重复1,2.得出答案。

下面有两题leetcode题,一道困难一道中等,现在看来还挺简单的,23333
另外STL的unordered_map的count方法,是验证key值是否存在。
同时如果key值不存在,新加的key对应的值默认为零

438. 找到字符串中所有字母异位词

题目说明:

给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。

字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。
class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
       unordered_map<char,int> need; //需要查找的字符串保存的次数
       unordered_map<char,int> window; //需要维护的窗口。
       int left=0,right=0;//左指针和右指针初始化为零 
       vector<int> res;//保存结果的
       for(char c:p) need[c]++;  //将需要匹配的字符串存入need中
       int match=0; //判断是否满足,即是否包含
       while(right<s.size())
       {
           char tmp1=s[right]; 
           if(need.count(tmp1))
           {
               window[tmp1]++;
               if(window[tmp1]==need[tmp1])
               {
                   match++;
               }
           }
           right++;
           while(match==need.size()) //满足条件,left指针不断向右边,前进,直到不满足条件
           {
               if(right-left==p.size())
               {
                     res.push_back(left);
               }
            
               char tmp2=s[left];
               if(need.count(tmp2))
               {
                   window[tmp2]--;
                   if(window[tmp2]<need[tmp2])
                   {
                       match--;
                   }
               }
               left++;
           }
       }
       return res;
    }
};

76. 最小覆盖子串

给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串。

示例:

输入: S = "ADOBECODEBANC", T = "ABC"
输出: "BANC"
说明:

如果 S 中不存这样的子串,则返回空字符串 ""。
如果 S 中存在这样的子串,我们保证它是唯一的答案。

class Solution {
public:
    string minWindow(string s, string t) {
       unordered_map<char,int> need;
       unordered_map<char,int> window;
       int start=0,minlen=INT_MAX;
       for(char c:t)
       {
           need[c]++;
       }
       int left=0,right=0;
       int match=0;
       while(right<s.size())
       {
           char tmp=s[right];
           if(need.count(tmp))
           {
               window[tmp]++;
               if(window[tmp]==need[tmp])
               {
                   match++;
               }
           }
           right++;
           while(match==need.size())
           {
               if(right-left<minlen)
               {
                   start=left;
                   minlen=right-left;
               }
               char w=s[left];
               if(need.count(w))
               {
                   window[w]--;
                   if(window[w]<need[w])
                   {
                       match--;
                   }
               }
               left++;
               
               
           }
       }
       return minlen==INT_MAX?"":s.substr(start,minlen);

    }
};
posted @ 2020-02-03 16:25  YenKoc  阅读(358)  评论(0编辑  收藏  举报