牛客网: BM90
题目: 在字符串s中找出包含t中所有字符的最小连续子串
思路: 初始化t中字符量计数map, 遍历t中每个字符,每遇到一个递减1;设置检测函数f,即m中所有key的值都不小于0;初始化双指针slow, fast = 0, 0;left, right = -1, -1遍历s,每遍历一个字符,检测一次f是否满足要求,满足时更新left, right值,同时移动slow,更新m;直到fast走到s的结束。
代码:
// go
package main
// import "fmt"
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param S string字符串
* @param T string字符串
* @return string字符串
*/
func check(hash map[byte]int) bool {
for _, v := range hash {
if v < 0 {
return false
}
}
return true
}
func minWindow( S string , T string ) string {
// write code here
cnt := len(S) + 1
hash := make(map[byte]int)
for i := 0; i < len(T); i++ {
hash[T[i]] -= 1
}
slow, fast := 0, 0
left, right := -1, -1
for ; fast < len(S); fast++ {
c := S[fast]
hash[c]++
for check(hash) {
if cnt > fast - slow + 1 {
cnt = fast - slow + 1
left = slow
right = fast
}
c := S[slow]
hash[c]--
slow++
}
}
if left == -1 {
return ""
}
return S[left:right+1]
}