前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 727. 最小窗口子序列(滑动窗口)

LeetCode 727. 最小窗口子序列(滑动窗口)

作者头像
Michael阿明
发布2021-02-19 11:13:45
1.7K0
发布2021-02-19 11:13:45
举报
文章被收录于专栏:Michael阿明学习之路

文章目录

1. 题目

给定字符串 S and T,找出 S 中最短的(连续)子串 W ,使得 T 是 W 的 子序列 。

如果 S 中没有窗口可以包含 T 中的所有字符,返回空字符串 “”。 如果有不止一个最短长度的窗口,返回开始位置最靠左的那个。

代码语言:javascript
复制
示例 1:
输入:
S = "abcdebdde", T = "bde"
输出:"bcde"
解释:
"bcde" 是答案,因为它在相同长度的字符串 "bdde" 出现之前。
"deb" 不是一个更短的答案,因为在窗口中必须按顺序出现 T 中的元素。
 
注:
所有输入的字符串都只包含小写字母。
S 长度的范围为 [1, 20000]。
T 长度的范围为 [1, 100]。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/minimum-window-subsequence 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

类似题目:LeetCode 76. 最小覆盖子串(滑动窗口)

  • 先向右匹配,全部匹配了,再向左寻找最近的匹配点 x (可能较短)
  • 从x+1再循环上面步骤
代码语言:javascript
复制
class Solution {
public:
    string minWindow(string S, string T) {
    	int i = 0, j = 0, minlen = INT_MAX;
    	int l = -1, r;
    	while(i < S.size())
    	{
    		if(S[i] == T[j])
    		{
    			j++;
    			if(j == T.size())//全部匹配了
    			{
    				r = i+1;
    				j--;
    				while(j >= 0)
    				{
    					while(S[i] != T[j])//向左匹配
    						i--;
    					i--;j--;
    				}
    				i++,j++;
    				if(r-i < minlen)
    				{
    					minlen = r - i;
    					l = i;
    				}
    			}
    		}
    		i++;
    	}
    	return l == -1 ? "" : S.substr(l,minlen);
    }
};

20 ms 8.4 MB

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/08/14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档