Leetcode#76 Minimum Window Substring

原题地址

 

用两个指针分别记录窗口的左右边界,移动指针时忽略那些出现在S种但是没有出现在T中的字符

1. 扩展窗口。向右移动右指针,当窗口内的字符即将多于T内的字符时,停止右移

2. 收缩窗口。向右调整左指针,当窗口内的字符即将少于T内的字符时,停止右移

3. 统计结果。如果窗口内的字符包含了T内的所有字符,且窗口更小,更新最小窗口

4. 继续下一个周期(返回1)

 

大致思路就是这样了,在具体实现中我用了一个left变量记录当前还未完全包含的非重字符数量,比如当前窗口还差2个a和3个b,则left=2,这样,当left=0时就知道已经包含了所有T的字符。

 

代码:

 1 string minWindow(string S, string T) {
 2   map<char, int> tMap;
 3   map<char, int> windowMap;
 4   int sLen = S.length();
 5   int tLen = T.length();
 6   string window = "";
 7   int left = 0;
 8 
 9   for (int i = 0; i < tLen; i++)
10     tMap[T[i]]++;
11   left = tMap.size();
12 
13   // 扩展
14   for (int l = 0, r = 0; r < sLen;) {
15     for (bool shrink = false; r < sLen && !shrink; r++) {
16       if (tMap.find(S[r]) != tMap.end()) {
17         windowMap[S[r]]++;
18         if (windowMap[S[r]] == tMap[S[r]])
19           left--;
20         shrink = windowMap[S[r]] >= tMap[S[r]];
21       }
22     }
23 
24     // 收缩
25     for (; l < r; l++) {
26       if (tMap.find(S[l]) != tMap.end()) {
27         if (windowMap[S[l]] <= tMap[S[l]])
28           break;
29         windowMap[S[l]]--;
30       }
31     }
32 
33     if (!left && (window.empty() || window.length() > r - l))
34       window = S.substr(l, r - l);
35   }
36 
37   return window;
38 }

 

转载于:https://www.cnblogs.com/boring09/p/4241743.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值