最小覆盖子串
Problem: 76. 最小覆盖子串
思路
滑动窗口 很简单
解题方法
滑动窗口
复杂度
时间复杂度:
添加时间复杂度, 示例: $O(n)$
空间复杂度:
添加空间复杂度, 示例: $O(n)$
Code
func minWindow(s string, t string) string {
result := ""
// 剔除错误答案
if len(t) == 0 {
return result
}
if len(t) > len(s) {
return result
}
// 用于比较的数组
tArray, resultArray := ['z' - 'A' + 1]int{}, ['z' - 'A' + 1]int{}
// 记录开始与结尾区间
startIndex, endIndex := 0, 0
// 初始化t数组和tMinIndex
for _, char := range t {
tArray[char-'A']++
}
// 开始循环
for _, char := range s {
// endIndex++
endIndex++
// 先判断当前字符是否在t中, 如果存在则++
if tArray[char-'A'] > 0 {
resultArray[char-'A']++
// 现在多了一个字符了, 来判断一下是否满足子串吧
for i := 0; i < len(tArray); i++ {
if resultArray[i] < tArray[i] {
break
}
if resultArray[i] >= tArray[i] && i == len(tArray)-1 {
// 将没用的非有效部分直接去掉
for tArray[s[startIndex]-'A'] == 0 {
startIndex++
}
// 再尝试缩小数据范围
for tArray[s[startIndex]-'A'] == 0 || resultArray[s[startIndex]-'A'] > tArray[s[startIndex]-'A'] {
if tArray[s[startIndex]-'A'] != 0 {
resultArray[s[startIndex]-'A']--
}
startIndex++
}
// 判断成功 保存result
if len(result) == 0 || len(result) > endIndex-startIndex {
result = s[startIndex:endIndex]
}
}
}
}
}
return result
}