给出两个字符串 S 和 T,要求在O(n)的时间复杂度内在 S中找出最短的包含 T 中所有字符的子串。
例如:
S="XDOYEZODEYXNZ"
T="XYZ"
找出的最短子串为"YXNZ".
注意:
如果 S 中没有包含 T 中所有字符的子串,返回空字符串 “”;
满足条件的子串可能有很多,但是题目保证满足条件的最短的子串唯一。
思路:记录开始和结束位置,当结束位置之内T中的字符全部存在,那么结束位置结束,开始位置向前,如果开始位置到达一个位置之后,去掉这个字符,T中某一个字符缺少,就记录这个从开始位置到结束位置是不是最短的,然后结束位置继续向后,类似于滑动窗口
package main
/**
*
* @param S string字符串
* @param T string字符串
* @return string字符串
*/
func minWindow( S string , T string ) string {
// write code here
var ret string
count := len(T)
mapT := make(map[byte]int)
for i := 0; i < len(T); i++ {
mapT[T[i]]++
}
minLen := len(S)
start := 0
//end := len(S)
for i := 0; i < len(S); i++ {
if _, ok := mapT[S[i]]; ok {
mapT[S[i]]--
if mapT[S[i]] >= 0 {
count--
}
}
for count == 0 {
if i-start < minLen {
minLen = i - start
ret = S[start : i+1]
}
if _, ok := mapT[S[start]]; ok {
mapT[S[start]]++
if mapT[S[start]] > 0 {
count++
}
}
start++
}
}
return ret
}