剑指 Offer II 017. 含有所有字符的最短字符串

题目

力扣

思路 滑动窗口

因为大写英文字母范围是65-90,小写英文字母范围是97-122,所以声明一个大小为123的数组。整体思想是先向右移动右指针找到s中包含t所有字符的子串,再向右移动左指针直到左指针指向的字符是需要且不多余的。首先遍历字符串t,对其中出现的字符在数组中++,表示需要这个字符,并用一个变量c=t.size()表示需要的总字符数。如果数组中对应的元素是负的,就表明这个元素数量多了。然后遍历字符串s,出现的字符在数组中--,并判断如果本来是需要的,就得把cnt--。如果cnt==0,就表明不需要了,再找到子串的开头(应为需要的字符),然后判断长度输出。

代码

class Solution {
public:
    string minWindow(string s, string t) {
        vector<int> v(123,0);
        int cnt=t.size(),start=-1,len=INT_MAX;
        for(char c:t)
            v[c]++;
        for(int l=0,r=0;r<s.size();r++){
            char c=s[r];
            if(v[c]-->0)
                cnt--;
            if(cnt==0){
                while(v[s[l]]<0)
                    v[s[l++]]++;
                if(len > r-l+1){
                    len = r-l+1;
                    start = l;
                }
                v[s[l++]]++;
                cnt++;
            }
        }
        return len == INT_MAX ? "" : s.substr(start,len);
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值