76. 最小覆盖子串(C++)---滑动窗口(配合哈希表)解题

题目详情
给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。

示例:

输入: S = "ADOBECODEBANC", T = "ABC"
输出: "BANC"

说明:

  • 如果 S 中不存这样的子串,则返回空字符串 ""。
  • 如果 S 中存在这样的子串,我们保证它是唯一的答案。
     

——题目难度:困难


 




代码如下

class Solution {
public:
    	unordered_map<char,int> saveS, saveT;
        
    bool check() {
        for(const auto &tmp: saveT)
        {
        	if(saveS[tmp.first] < tmp.second) {
        		return false;
        	}
        }
        return true;
    }
        
    string minWindow(string s, string t) {
    	int len = s.size();
    	if(len == 0 || t.size() == 0) return "";
        for(const auto &ch: t)
        {
        	++saveT[ch];
        }
        
        int l = 0, r = 0;
		int ansL = -1, MinLen = INT_MAX;
		while(r < len) {
			if(saveT.find(s[r]) != saveT.end()) {
				++saveS[s[r]];
			}
			
			while(check()) {
				if(r-l+1 < MinLen) {
					MinLen = r-l+1;
					ansL = l;
				}
				if(saveT.find(s[l]) != saveT.end()) {
					--saveS[s[l]];
				}
				l++;
			}
			
			r++;
		}
		
		return ansL==-1 ? "" : s.substr(ansL, MinLen);
    }
};

结果

 

 

 

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 书香水墨 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读