zoukankan      html  css  js  c++  java
  • 滑动窗口通用解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);
    
        }
    };
    
  • 相关阅读:
    C/C++中浮点数输出格式问题
    C/C++中的输出对齐设置
    C++11 中的initialize_list
    c++中的构造函数初始化列表
    C++11中的array
    STL 中的链表排序
    poj1068 Parencodings
    poj 3295 Tautology
    How To Join XLA_AE_HEADERS and RCV_TRANSACTIONS(子分类账到事务处理追溯)
    销售订单的四个主要环节和每个环节用到的常用表
  • 原文地址:https://www.cnblogs.com/YenKoc/p/12779949.html
Copyright © 2011-2022 走看看