Day6-LeetCode刷题(滑动窗口学习)

今天是刷题的第六天,前几天因为在打美赛所以没有刷题,现在继续刷题。

76. Minimum Window Substring(hard)

原题地址
在这里插入图片描述

题目描述

  • 这道题的题意是给定两个字符串S 和T,求S 中包含T 所有字符的最短连续子字符串的长度,同时要求时间复杂度不得超过O(n)。
  • 输入是两个字符串S 和T,输出是一个S 字符串的子串。

策略

  • 本题使用滑动窗口求解,即两个指针l 和r 都是从最左端向最右端移动,且l 的位置一定在r 的左边或重合。注意本题虽然在for 循环里出现了一个while 循环,但是因为while 循环负责移动l指针,且l 只会从左到右移动一次,因此总时间复杂度仍然是O(n)。本题使用了长度为128的数组来映射字符,也可以用哈希表替代;其中chars 表示目前每个字符缺少的数量,flag 表示每个字符是否在T 中存在。

代码:

class Solution {
    
    
public:
    string minWindow(string s, string t) {
    
    
        vector<int> chars(128,0);
        vector<bool> flag(128,false);
        for(int i=0; i<t.size(); i++){
    
    
            chars[t[i]] ++;
            flag[t[i]] = true;
        }
        int cnt=0, l=0, min_l=0, min_size=s.size()+1;
        for(int i=0;i<s.size();i++){
    
    
            if(flag[s[i]]){
    
    
                if(--chars[s[i]] >= 0){
    
    
                    cnt++;
                }
                while(cnt == t.size()){
    
    
                    if(i-l+1 < min_size){
    
    
                        min_l = l;
                        min_size = i-l+1;
                    }
                    if(flag[s[l]] && ++chars[s[l]]>0){
    
    
                        --cnt;
                    }
                    ++l;
                }
            }
        }
        return min_size>s.size() ? "":s.substr(min_l, min_size);
    }
};

猜你喜欢

转载自blog.csdn.net/Geek_/article/details/113781293