⭐LeetCode 567. Permutation in String

题目描述

在这里插入图片描述

知识点

滑动窗口

结果

在这里插入图片描述

实现

码前思考

  1. 其实就是LeetCode 76. Minimum Window Substring的一个变体,变体体现在把 寻找最短长度 改成了 当窗口满足条件并且长度等于s1时要返回true。也就是定死了最短长度是s1本身。

代码实现

//类似的滑动窗口问题
//只是加强了一些条件
class Solution {
public:
    bool checkInclusion(string s1, string s2) {
        int left = 0;
        int right = 0;
        int valid = 0;

        unordered_map<char,int> need;
        unordered_map<char,int> window;
        for(char c : s1){
            need[c]++;
        }

        //开始进行一个匹配
        while(right < s2.size()){
            char c1 = s2[right];
            //需要进行的操作
            if(need.count(c1)){
                window[c1]++;
                if(window[c1] == need[c1]){
                    valid++;
                }
            }
            //移动right
            right++;

            while(valid == need.size()){
                //在left缩小里面去进行求解问题
                if(right - left == s1.size()){
                    return true;
                }

                //然后进行调整
                char c2 = s2[left];
                if(need.count(c2)){
                    if(window[c2] == need[c2]){
                        valid--;
                    }
                    window[c2]--;
                }
                left++;
            }
        }

        return false;
    }
};

码后反思

  1. 网友的题解跟我的思路有一点点不同,我的就比较呆板了,网友的比较活跃,灵活地思考了滑动窗口!
  2. 滑动窗口就是一套模板加上四个问题的思考:
    • 当移动right扩大窗口,即加入字符时,应该更新哪些数据?
    • 什么条件下,窗口应该暂停扩大,开始移动left缩小窗口?
    • 当移动left缩小窗口,即移出字符时,应该更新哪些数据?
    • 、我们要的结果应该在扩大窗口时还是缩小窗口时进行更新?
  3. 注意下面代码,我之前写错了,居然也过题了,leetcode神奇:
    之前写成了:
if(need.count(c2)){
	 window[c2]--;
	 if(window[c2] < need[c2]){
	     valid--;
	 }
}

上面是错误的!正确写法是下面这个:

if(need.count(c2)){
    if(window[c2] == need[c2]){
        valid--;
    }
    window[c2]--;
}
发布了173 篇原创文章 · 获赞 3 · 访问量 5212

猜你喜欢

转载自blog.csdn.net/yc_cy1999/article/details/105691846