2021-08-30:给定两个字符串str1和str2,在str1中寻找一个最短子串,能包含str2的所有字符,字符顺序无所谓,str1的这个最短子串也可以包含多余的字符。返回这个最短包含子串。
2021-08-30:给定两个字符串str1和str2,在str1中寻找一个最短子串,能包含str2的所有字符,字符顺序无所谓,str1的这个最短子串也可以包含多余的字符。返回这个最短包含子串。
福大大 答案2021-08-30:
滑动+哈希。对str2欠账表哈希,对str1滑动窗口。
时间复杂度:O(N)。
空间复杂度:O(1)。哈希是256的固定长度。
代码用golang编写。代码如下:
package main
import (
"fmt"
"math"
)
func main() {
s1 := "abcxa"
s2 := "aabc"
ret := minLength(s1, s2)
fmt.Println(ret)
}
func minLength(s1 string, s2 string) int {
if len(s1) < len(s2) {
return math.MaxInt64
}
map0 := make([]int, 256) // map[37] = 4 37 4次
for i := 0; i != len(s2); i++ {
map0[s2[i]]++
}
all := len(s2)
// [L,R-1] R
// [L,R) -> [0,0)
L := 0
R := 0
minLen := math.MaxInt64
for R != len(s1) {
map0[s1[R]]--
if map0[s1[R]] >= 0 {
all--
}
if all == 0 { // 还完了
for map0[s1[L]] < 0 {
map0[s1[L]]++
L++
}
// [L..R]
minLen = getMin(minLen, R-L+1)
all++
map0[s1[L]]++
L++
}
R++
}
if minLen == math.MaxInt64 {
return 0
} else {
return minLen
}
}
func getMin(a int, b int) int {
if a < b {
return a
} else {
return b
}
}
执行结果如下:
公众号:福大大架构师每日一题