76. 最小覆盖子串 每日一题 Golang

整一道leetcode,找找自信。

首先简历一个表来记录t里出现的字符及其数量。
这个表表示所需的字符及其数量。

我们在s上使用滑动窗口,上面的表就是初始状态,如果在滑动窗口的过程中表中每个字符所需的数字均小于等于0,则覆盖子串。

package main

import "fmt"

func contain(m map[int32]int) bool {
	for _,v:=range m{
		if v>0{
			return false
		}
	}
	return true
}

func hasKey(m map[int32]int,ch uint8) bool {
	_,ok:=m[int32(ch)]
	return ok
}

func minWindow(s string, t string) string {
	minLen:= len(s)+1
	ll,rr:=0,0
	charSet:=make(map[int32]int)
	for _,v:=range t{
		charSet[v]++
	}
	l,r:=0, 0
	for ;r<=len(s);{
		if contain(charSet){
			len:= r-l
			if len<minLen{
				minLen=len
				ll,rr=l,r
			}
			if hasKey(charSet,s[l]){
				charSet[int32(s[l])]++
			}
			l++
		}else{
			if r<len(s) && hasKey(charSet,s[r]){
				charSet[int32(s[r])]--
			}
			r++
		}
	}
	return s[ll:rr]
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值