【Leetcode 3】【Leetcode 567】【GO】滑动窗口

简述

本期主要分享滑动窗口的一种实现方法

即将滑动窗口内的字符以数组形式记录每个字符数。
当触发左边界右移的条件时,将左指针右移到数组数据符合预期位置。
这个条件的判断主要通过数组的数据多少来实现。

具体实现在下面的例题中分析

【Leetcode 3】无重复字符的最长子串

题目

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

解法

func lengthOfLongestSubstring(s string) int {
    ans := 0
    left := 0
    cnt := [128]int{} 
    for right, c := range s {
        cnt[c]++
        for cnt[c] > 1 { // 不满足要求
            cnt[s[left]]--
            left++
        }
        ans = max(ans, right-left+1)
    }
    return ans
} 

func max(a, b int) int { if b > a { return b }; return a }

将滑动窗口内的字符转化成数组内对应的下标。数组内下标的值就是字符数。
当字符数超过题目的设定,即一个时。
就把左指针开始向右移动,直到数组的右指针下标对应的值重新变成 1

【Leetcode 567】字符串的排列

题目

给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false 。

换句话说,s1 的排列之一是 s2 的 子串

解法

func checkInclusion(s1 string, s2 string) bool {
    tar := [26]int{}
    for _, letter := range s1 {
        tar[letter-97]++
    }
    cur := [26]int{}
    idx := 0
    tarLen := len(s1)
    curLen := 0
    for _, letter := range s2 {
        cur[letter-97]++
        curLen++
        for cur[letter-97] > tar[letter-97] {
            cur[s2[idx]-97]--
            curLen--
            idx++
        }
        if curLen == tarLen {
            return true
        }
    }
    return false
}

思路类似,但区别主要在于判断条件。
读题,要求 s1 的排列是 s2 的子串,即在 s2 中有一段的字符与 s1 的相同
那么,我们就要先记录下 s1 的字符数,作为滑动窗口的限制条件。超过就要右移。
然后,因为判断是否即可。那么就要有个退出条件。就是匹配出 s1 了,这个可以等价为滑动窗口的长度等于 s1.
好,综上所述,就得到了对应的代码。

你可能感兴趣的:(leetcode,算法,golang)