整一道leetcode,找找自信。
首先简历一个表来记录t里出现的字符及其数量。
这个表表示所需的字符及其数量。
我们在s上使用滑动窗口,上面的表就是初始状态,如果在滑动窗口的过程中表中每个字符所需的数字均小于等于0,则覆盖子串。
package main
import "fmt"
func contain(m map[int32]int) bool {
for _,v:=range m{
if v>0{
return false
}
}
return true
}
func hasKey(m map[int32]int,ch uint8) bool {
_,ok:=m[int32(ch)]
return ok
}
func minWindow(s string, t string) string {
minLen:= len(s)+1
ll,rr:=0,0
charSet:=make(map[int32]int)
for _,v:=range t{
charSet[v]++
}
l,r:=0, 0
for ;r<=len(s);{
if contain(charSet){
len:= r-l
if len<minLen{
minLen=len
ll,rr=l,r
}
if hasKey(charSet,s[l]){
charSet[int32(s[l])]++
}
l++
}else{
if r<len(s) && hasKey(charSet,s[r]){
charSet[int32(s[r])]--
}
r++
}
}
return s[ll:rr]
}