一:无重复字符串最长子串(3)

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

示例 1:

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
示例 4:

输入: s = ""
输出: 0

func lengthOfLongestSubstring(s string) int {
    /**
    思路分析:
    不重复连续的一段字符串,这段必然是整体的一部分。所以这里可以用滑动窗口。试想比如asdfgd,针对上面这个,我们开始先把元素加到map中,每次比较map里没有就加入,比如现在是 asdfg了,现在看下一个d存在了,所以这个d加不进去了,右窗口也无法移动,这时候右不动,左动。一直到左不动右动。当左边把d移走,右边的d就能进来了,这样最终就能把最大的取到。

    **/
    
    //开始

    //先循环主体

    n := len(s)
    var memory = make(map[byte]int, n)
    maxSize := 0

    //定义左右窗口,定义右为-1,左为0。因为右边每次要加+,又要把第一个加进来,所以直接-1开始
    j := 0
    for i:=0; i<n; i++ {
        if i > 0 {
            //当右不动左才动,所以左动要移出,右动要加入
            delete(memory, s[i-1])
        }

        //右动,因为窗口长度是右-左,所以这个j是一不会重置的变量
        //memory没有才加入
        for j < n && memory[s[j]] == 0 {
            memory[s[j]] = 1
            j++//右移
        }

        //每一次选出最大的,此时右边是j+1,左边是i
        maxSize = max(maxSize, len(memory))
    }

    return maxSize
}

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

    return b
}

二、:存在重复元素(217)

给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的 绝对值 至多为 k。

示例 1:

输入: nums = [1,2,3,1], k = 3
输出: true
示例 2:

输入: nums = [1,0,1,1], k = 1
输出: true
示例 3:

输入: nums = [1,2,3,1,2,3], k = 2
输出: false

func containsNearbyDuplicate(nums []int, k int) bool {
    /**
    思路分析:
    利用滑动窗口,找到重复的,就比较差值绝对值,如果大于k,就返回false并终止
    **/

    //开始
    n := len(nums)
    var memory = make(map[int]int, n)

    j := 0

    //这里重复就是指的左右窗口,利用两个值差判断就行
    for i:=0; i<n; i++ {
        if i > 0 {
            delete(memory, nums[i-1])
        }

        //有重复的
        for j < n && memory[nums[j]] == 0 {
            memory[nums[j]] = 1
            j++
        }

        if j >= n {
            break
        }

        //j+1肯定是大于i的,只要存在就返回false
        if j - i <= k {
            return true
        }
    }

    return false
}