leetcode sliding window 76 最小覆盖子串

O

问题

解决方案

代码



/*

思路: 这种字符串里面找子串问题采用滑动窗口, 套用滑动的模板

-  define need ,window hashtable.
- add target into need 
- define left ,right
- define start, end as record minest index;
- while right<size()
- -  get s[right]
- -  right++;
- - judge s[right] is in need  and make it into window,
- -  while right is enough,need is all down.using valid == need.size()
- - -    get left vale and left++;
- - - if value in need ,  into another if and judge if need(left)size == window(left)size      delete window ,  vlid == need.size()


*/

class Solution {
    
    
public:
   string minWindow(string s, string t) {
    
    
       unordered_map<char, int> need , window;
       for(char c: t) need[c]++;  // get every char number.
       int left = 0, right = 0,valid= 0;
       int start = 0 ,end = 0, len=s.size()+1 ;
       while(right<s.size()){
    
    
           char temp = s[right];
           right++;
           if(need.count(temp)){
    
    
               window[temp]++;
               if(window[temp]==need[temp]) //it mean the number of char is ok
                   valid++;  // one char  is over.
           }
           while(valid==need.size()){
    
    
               char a = s[left];


               if(right-left<len){
    
    
                   start = left;
                   end = right;
                   len = right -left;
               }

               

               
               left++;
               if(need.count(a)){
    
    
                   if(need[a]==window[a])
                       valid--;
                   window[a]--;
               }
           }
       }

       return  end ==0? "": s.substr(start,end-start);

   }
};

总结与反思

  1. 第一次做这种题目,滑动窗口问题是真的难。子字符串的个数要匹配才算找到最左侧边界。
  2. hashtable真的很有用。 很多问题都可以用hashtable 去解决。

猜你喜欢

转载自blog.csdn.net/liupeng19970119/article/details/114094894