滑动窗口专项训练 更新记录 2024.5.17 第一次记录
一般解题步骤 待更新
1.定义需要维护的变量
可能是:
2.初始化滑动窗口,start
和end
一般都初始化为0(如果是双指针两边夹的情况,一般都是贪心?)
解题模板 由于自己的理解还不够深刻,这里借鉴大佬的思路
https://leetcode.cn/problems/longest-substring-with-at-most-two-distinct-characters/solutions/879777/hua-dong-chuang-kou-zhen-di-jian-dan-yi-73bii
大佬的是python的版本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 class Solution : def problemName (self, s: str ) -> int : x, y = ..., ... start = 0 for end in range (len (s)): x = new_x if condition: y = new_y ''' ------------- 下面是两种情况,读者请根据题意二选1 ------------- ''' if 窗口长度大于限定值: while 不合法: return ...
按照大佬是思路,改成JS的版本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 var problemName = function (s ) { let [x, y] = ... let st = 0 ; for (let end = 0 ; end < s.length ; s++){ x = new_x; if (condition){ y = new_y; } if (窗口长度大于限定值){ } while (不合法){ } } return ... };
实战训练 无重复字符的最长子串 3. 无重复字符的最长子串
给定一个字符串 s
,请你找出其中不含有重复字符的最长子串 的长度。
示例 1:
1 2 3 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
1 2 3 输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
1 2 3 4 输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示:
0 <= s.length <= 5 * 104
s
由英文字母、数字、符号和空格组成
code:
不用map,用set和单纯数组都行,数组的话就用include方法来查看字母是否已经存在于数组中,但是最好还是不要数组了,数组里面删除一个元素会很麻烦,主要还是哈希+滑动窗口的思想。
用set的话会简单一点点
带注释版本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 var lengthOfLongestSubstring = function (s ) { if (s.length ==0 ) return 0 ; let maxLen = -1 ; let hash = new Map (); let st = 0 ; for (let end = 0 ; end < s.length ; end++){ let c = s[end]; if (hash.has (c)){ while ( st < end && s[st] != c){ hash.delete (s[st]); st++; } st++; }else { hash.set (c, 1 ); } maxLen = Math .max (maxLen, end - st + 1 ); } return maxLen; };
不带注释
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 var lengthOfLongestSubstring = function (s ) { if (s.length ==0 ) return 0 ; let maxLen = -1 ; let hash = new Map (); let st = 0 ; for (let end = 0 ; end < s.length ; end++){ let c = s[end]; if (hash.has (c)){ while ( st < end && s[st] != c){ hash.delete (s[st]); st++; } st++; }else { hash.set (c, 1 ); } maxLen = Math .max (maxLen, end - st + 1 ); } return maxLen; };
找到字符串中所有字母异位词 438. 找到字符串中所有字母异位词
给定两个字符串 s
和 p
,找到 s
中所有 p
的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。
示例 1:
1 2 3 4 5 输入: s = "cbaebabacd", p = "abc" 输出: [0,6] 解释: 起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。 起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。
示例 2:
1 2 3 4 5 6 输入: s = "abab", p = "ab" 输出: [0,1,2] 解释: 起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。 起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。 起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。
Code:
窗口不合理的情况比较复杂
带注释版本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 var findAnagrams = function (s, p ) { let hash = new Map (); let hash2 = new Map (); let res = []; for (let i = 0 ; i < p.length ; i++){ if (hash.has (p[i])){ hash.set (p[i], hash.get (p[i]) + 1 ); }else hash.set (p[i], 1 ); } let st = 0 ; for (let end = 0 ; end < s.length ; end++){ let c = s[end]; if (hash2.has (c)){ hash2.set (c, hash2.get (c) + 1 ); }else hash2.set (c, 1 ); if (!hash.has (c)){ while (st != end + 1 ){ hash2.set (s[st], hash2.get (s[st]) - 1 ); st++; } }else if (hash2.get (c) > hash.get (c)){ while (hash2.get (c) != hash.get (c)){ hash2.set (s[st], hash2.get (s[st]) - 1 ); st++; } } while (end - st + 1 > p.length ){ hash2.set (s[st], hash2.get (s[st]) - 1 ); st++; } if (end - st + 1 === p.length ){ res.push (st); } } return res; };
不带注释版本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 var findAnagrams = function (s, p ) { let hash = new Map (); let hash2 = new Map (); let res = []; for (let i = 0 ; i < p.length ; i++){ if (hash.has (p[i])){ hash.set (p[i], hash.get (p[i]) + 1 ); }else hash.set (p[i], 1 ); } let st = 0 ; for (let end = 0 ; end < s.length ; end++){ let c = s[end]; if (hash2.has (c)){ hash2.set (c, hash2.get (c) + 1 ); }else hash2.set (c, 1 ); if (!hash.has (c)){ while (st != end + 1 ){ hash2.set (s[st], hash2.get (s[st]) - 1 ); st++; } }else if (hash2.get (c) > hash.get (c)){ while (hash2.get (c) != hash.get (c)){ hash2.set (s[st], hash2.get (s[st]) - 1 ); st++; } } while (end - st + 1 > p.length ){ hash2.set (s[st], hash2.get (s[st]) - 1 ); st++; } if (end - st + 1 === p.length ){ res.push (st); } } return res; };