最小覆盖子串

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
}
posted @ 2024-06-06 15:18  烟熏咸鱼干  阅读(3)  评论(0编辑  收藏  举报