每日一练 55--58 滑动窗口

55

力扣icon-default.png?t=LA92https://leetcode-cn.com/problems/M1oyTv/

思路

最短子字符串,没有要求连续,最重要的就是要搞定滑动窗口的定义

func minWindow(s string, t string) string {
	n := len(s)
	var cntS [128]int
	var cntT [128]int
	var cnt int
	res := s + "#"
    //获取t字符串字符的数目
	for _, c := range t {
		cntS[c]++
		cntT[c]++
	}
    //获取t字符串中不相同字符的数目
	for _, c := range cntS {
		if c > 0 {
			cnt++
		}
	}
	l := 0
	r := 0
    //设置滑动窗口
	for r < n {
		cntS[s[r]]--
		if cntT[s[r]] > 0 && cntS[s[r]] == 0 {
            //如果是子字符串t的字符且在s中已经为0,说明有一个字符已经被窗口包含了
			cnt--
		}
		for cnt == 0 {
            //当cnt==0,说明滑动窗口l-r包含了子子符串所有,获取结果
			if len(res) > r-l+1 {
				res = s[l : r+1]
			}
			if cntT[s[l]] > 0 && cntS[s[l]] == 0 {
                //准备向前滑动滑动窗口
                //若是s[l]是子字符串的值则说明滑动窗口还需要滑动
				cnt++
			}
            //将之前减去的加上start向前滑动1
			cntS[s[l]]++
			l++
		}
        //end向前滑动
		r++
	}
	if len(res) > n {
		res = ""
	}
	return res
}

56

nullicon-default.png?t=LA92https://leetcode-cn.com/problems/XltzEq/

思路

双指针

func isPalindrome(s string) bool {
	usefull:=make(map[uint8]bool)
	//数字
	for i:=0;i<10;i++{
		num:=strconv.Itoa(i)
		usefull[num[0]] = true
	}
	for i:=97;i<=122;i++{
		usefull[uint8(i)] = true
	}
	for i:=65;i<=90;i++{
		usefull[uint8(i)] = true
	}
	start:=0
	end:=len(s)-1
	for start<end{
		for start<end&&usefull[s[start]]!=true{
			start++
		}
		for end>0&&usefull[s[end]]!=true{
			end--
		}
		if start>end{
			break
		}
		tmps:=s[start]
		tmpe:=s[end]
		if tmpe>=97{
			tmpe = tmpe - 32
		}
		if tmps>=97{
			tmps = tmps -32
		}
		if tmpe!=tmps{
			return false
		}
		start++
		end--
	}
	return true
}

57

力扣icon-default.png?t=LA92https://leetcode-cn.com/problems/RQku0D/

func innerValidPalindrome(s string)bool{
	if len(s)==1{
		return false
	}
	var start,end int
	end = len(s) - 1
	for start < end{
		if s[start] != s[end]{
			return false
		}
		start++
		end--
	}
	return true
}

//双指针
func validPalindrome(s string) bool {
	var start,end int
	end = len(s) - 1
	for start < end{
		if s[start] != s[end]{
			if end-start<=1{
				return true
			}
			return innerValidPalindrome(s[start+1:end+1])||innerValidPalindrome(s[start:end])
		}
		start++
		end--
	}
	return true
}

58

力扣icon-default.png?t=LA92https://leetcode-cn.com/problems/a7VOhD/

func countIsPalindrome(str string)bool{
	var start,end int
	end = len(str) - 1
	for start<end{
		if str[start]!=str[end]{
			return false
		}
		start++
		end--
	}
	return true
}

func countSubstrings(s string) int {
	var count int
	for i:=0;i<len(s);i++{
		for j:=i+1;j<len(s);j++{
			if countIsPalindrome(s[i:j+1]){
				count++
			}
		}
	}
	count = count + len(s)
	return count
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值