一:无重复字符串最长子串(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
}