LeetCode 76 minimum window substring

Find the smallest window in a string containing all characters of another string

原文地址http://www.geeksforgeeks.org/find-the-smallest-window-in-a-string-containing-all-characters-of-another-string/

leetcode上该题名为minimum window substring

由两个字符串string1与string2,找出string1的一个子串,该子串包含了string2中所有的字符。最后返回这些子串中最短的一个。

例:
string1: this is a test string
string2: tist
输出: t stri (test string)

方法1(暴力搜索)
a)生成string1的所有子串
b)对每个子串检查是否包含了string2
c)返回最小的子串

方法2
1) 为string2建立一个数组count[].数组中存放字符出现的次数
stri中各个字符出现的次数为
count[‘i’] = 1
count[‘t’] = 2
count[’s’] = 1
2) 从左向右扫描string1,直到找到所有string2中的字符。为了检查是否找到所有字符,需要使用 1)中建立的count[]数组.因此首先找到“this is a t”子串,这个子串包含string2中的所有字符。然后更新所找到的结果。

3) 接着继续访问下一个字符,并将下一个字符添加到“this is a t”子串中。当新添加一个字符时,要检查新字符是否匹配子串左左边的字符(窗口左边界),如果匹配,将该字符添加到子串最右侧,并删除最左侧字符及该字符右侧所有多余的字符。当删除完这些字符后,计算新窗口的长度,并更新最小值。

:要得到最小窗口,窗口最边界字符必然是目标字符中的字符,为了更新窗口,即向右移动左边界,只有当找到一个与左边界相等的字符才移动,这样能保证新窗口包含所有字符。而多余字符指未出现在目标串,以及重复出现的字符。 同理右边届扩展就等价于先将左边界向右移动,直到遇到在目标串中出现的字符,那么新的左边界就确定了,然后扩展右边界找出新窗口即可。

例:添加e到this is a t后,然后添加s,t. t匹配子串中左边界,因此将多余字符删除,并得到新的窗口t stri。随后更新最小值。最后加入n,g,这并未导致更新发生因此最小窗口中的字符是t stri。

4) 返回最小值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值