牛客题霸 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 最小覆盖子串的主要内容,如果未能解决你的问题,请参考以下文章