leetcode sliding window 567 字符串的排列

O

问题

解决方案

代码

/*


/*
思路: 这个字符串还是需要根据字符串的个数去判断。 我们首先把滑动窗口的模板套进去, right扩大时候应该加入什么?ans 统计每个字符是否够了 什么时候暂停扩大?当左右间隔大于s1间隔的时候,因为即使包括了,但是大小不一致也不行的。当移动 left 即移出字符时,应该更新哪些数据?判断是否有效,没有效的话就把当前的内容所反映的信息都去掉,让右边继续往前。 我们要的结果应该在扩大窗口时还是缩小窗口时进行更新?收缩的时候更新。

- define map need ,window, and save need 
- define valid ,left ,right
-   while(right <size)
- -  temp = right value , right ++
- -  if(temp in need )  window[temp]++ , and if(window[temp]==need[temp]) valid++;
- -  while(right-left >s1 size)
- -  -  judge between left and right , whether valid == need.size();(这一步不容易想到的话可以加一个麻烦一点的操作。) if ==  return , else mean this substring is not really ans. we let window data--; if data number == need[] we also --;
*/


class Solution {
    
    
public:
   bool checkInclusion(string s1, string s2) {
    
    
       unordered_map<char, int> need , window;
       int left = 0, right = 0, valid = 0;
       for(char c: s1)need[c]++;
       while(right<s2.size()){
    
    
           char temp = s2[right];
           right++;
           if(need.count(temp)){
    
    
               window[temp]++;
               if(window[temp]==need[temp])
                   valid++;
               
           }
           while(right-left>=s1.size()){
    
    
               if(valid ==need.size())
                   return true;
               char b = s2[left];
               left++;
               if(need.count(b)){
    
    
                   if(window[b]==need[b])
                       valid--;
                   window[b]--;
               }
           }
       }
       return false;

   }
};

总结与反思

  1. 滑动窗口模板需要思考的问题如下:如下
  2. 这种题目比较难, 如果当前的left没有效果,要移除这个left点造成的所有影响。这些影响可能是right造成的。 但是left负责清理。

猜你喜欢

转载自blog.csdn.net/liupeng19970119/article/details/114096653
今日推荐