牛客题霸 NC28 最小覆盖子串

Posted Starzkg

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛客题霸 NC28 最小覆盖子串相关的知识,希望对你有一定的参考价值。

https://www.nowcoder.com/practice/c466d480d20c4c7c9d322d12ca7955ac

解决方案

Go

版本一

func minWindow(S string, T string) string {
	// write code here
	left, right := 0, 0             //表示窗口左右位置的指针
	start := 0                      //start 表示最后结果字符串开始位置
	var minLen int = 1e9            // minlen表示最后字符串长度,二者可以表示一个字符串
	var need = make(map[byte]int)   //need的存放字符串T的所有字符统计
	var window = make(map[byte]int) //window 存放现有的窗口中出现在need中的字符统计
	match := 0                      //window与need的匹配度
	for _, v := range T {
		need[byte(v)]++
	}

	for right < len(S) {
		for match < len(need) && right < len(S) {
			c1 := S[right]
			if _, ok := need[c1]; ok {
				window[c1]++
				if window[c1] == need[c1] {
					match++
				}
			}
			right++
		}
		for match == len(need) {
			//当匹配度等于need,说明这段区间可以作为候选结果,更新ret
			if right-left < minLen {
				minLen = right - left
				start = left
			}
			c2 := S[left]
			if _, ok := need[c2]; ok {
				window[c2]--
				if window[c2] < need[c2] {
					match--
				}
			}
			left++
		}
	}
	if minLen == 1e9 {
		return ""
	} else {
		return S[start : start+minLen]
	}
}

参考文章

以上是关于牛客题霸 NC28 最小覆盖子串的主要内容,如果未能解决你的问题,请参考以下文章

牛客题霸 NC10 大数乘法

牛客题霸 NC26 括号生成

牛客题霸 NC18 顺时针旋转矩阵

牛客题霸 NC23 划分链表

牛客题霸 NC17 最长回文子串

牛客题霸 NC12 重建二叉树