File tree 7 files changed +191
-47
lines changed
labuladong/lesson-0/window
7 files changed +191
-47
lines changed Load Diff This file was deleted.
Original file line number Diff line number Diff line change
1
+
2
+ var minWindow = function ( s , t ) {
3
+ let need = new Map ( ) ;
4
+ let window = new Map ( ) ;
5
+ for ( let c of t ) {
6
+ need . set ( c , ( need . get ( c ) || 0 ) + 1 ) ;
7
+ }
8
+
9
+ let left = 0 , right = 0 ;
10
+ let valid = 0 ;
11
+ // 记录最小覆盖子串的起始索引及长度
12
+ let start = 0 , len = Number . MAX_VALUE ;
13
+
14
+ while ( right < s . length ) {
15
+ // c 是将移入窗口的字符
16
+ let c = s [ right ] ;
17
+ // 右移窗口
18
+ right ++ ;
19
+ // 进行窗口内数据的一系列更新
20
+ if ( need . has ( c ) ) {
21
+ window . set ( c , ( window . get ( c ) || 0 ) + 1 ) ;
22
+ if ( window . get ( c ) === need . get ( c ) ) {
23
+ valid ++ ;
24
+ }
25
+ }
26
+
27
+ // 判断左侧窗口是否要收缩
28
+ while ( valid === need . size ) {
29
+ // 在这里更新最小覆盖子串
30
+ if ( right - left < len ) {
31
+ start = left ;
32
+ len = right - left ;
33
+ }
34
+ // d 是将移出窗口的字符
35
+ let d = s [ left ] ;
36
+ // 左移窗口
37
+ left ++ ;
38
+ // 进行窗口内数据的一系列更新
39
+ if ( need . has ( d ) ) {
40
+ if ( window . get ( d ) === need . get ( d ) ) {
41
+ valid -- ;
42
+ }
43
+ window . set ( d , window . get ( d ) - 1 ) ;
44
+ }
45
+ }
46
+ }
47
+ // 返回最小覆盖子串
48
+ return len === Number . MAX_VALUE ? "" : s . substring ( start , start + len ) ;
49
+ } ;
Original file line number Diff line number Diff line change
1
+ /**
2
+ * @param {string } s
3
+ * @return {number }
4
+ */
5
+ //给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串的长度。
6
+ var lengthOfLongestSubstring = function ( s ) {
7
+ let win = new Map ( )
8
+ let left = 0 ;
9
+ let right = 0
10
+ let res = 0
11
+ while ( right < s . length ) {
12
+ var c = s [ right ]
13
+ right ++
14
+ win . set ( c , ( win . get ( c ) || 0 ) + 1 )
15
+ while ( win . get ( c ) > 1 ) {
16
+ let t = s [ left ]
17
+ left ++
18
+ win . set ( t , ( win . get ( t ) || 0 ) - 1 )
19
+ }
20
+ res = Math . max ( res , right - left )
21
+ }
22
+ //console.log()
23
+ return res
24
+ } ;
Original file line number Diff line number Diff line change
1
+ /**
2
+ * @param {string } s
3
+ * @param {string } p
4
+ * @return {number[] }
5
+ */
6
+ //给定两个字符串 s 和 p,找到 s 中所有 p 的
7
+ //异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
8
+ var findAnagrams = function ( s , p ) {
9
+ let win = new Map ( )
10
+ let need = new Map ( )
11
+ let right = 0
12
+ let left = 0
13
+ let res = [ ]
14
+ let vaild = 0
15
+ for ( let c of p ) {
16
+ need . set ( c , ( need . get ( c ) || 0 ) + 1 )
17
+ }
18
+ while ( right < s . length ) {
19
+ var c = s [ right ]
20
+ right ++
21
+ if ( need . get ( c ) ) {
22
+ win . set ( c , ( win . get ( c ) || 0 ) + 1 )
23
+ if ( need . get ( c ) === win . get ( c ) ) {
24
+ vaild ++
25
+ }
26
+ }
27
+ while ( right - left >= p . length ) {
28
+ if ( vaild === need . size )
29
+ res . push ( left )
30
+ var d = s [ left ]
31
+ left ++
32
+ if ( need . has ( d ) ) {
33
+ if ( win . get ( d ) === need . get ( d ) ) {
34
+ vaild -- ;
35
+ }
36
+ win . set ( d , ( win . get ( d ) || 0 ) - 1 )
37
+ }
38
+ }
39
+
40
+ }
41
+ return res
42
+ } ;
Original file line number Diff line number Diff line change
1
+ /**
2
+ * @param {number[] } nums
3
+ * @return {number[][] }
4
+ */
5
+ var permute = function ( nums ) {
6
+ let res = [ ]
7
+ let path = [ ]
8
+ let used = Array ( nums . length ) . fill ( false ) ;
9
+ function back ( nums , path , used ) {
10
+ if ( path . length === nums . length ) {
11
+ res . push ( [ ...res ] )
12
+ }
13
+ for ( let i = 0 ; i < nums . length ; i ++ ) {
14
+ if ( used [ i ] ) {
15
+ continue ;
16
+ }
17
+ path . push ( nums [ i ] ) ;
18
+ used [ i ] = true ;
19
+ back ( nums , path , used ) ;
20
+ path . pop ( ) ;
21
+ used [ i ] = false ;
22
+ }
23
+ }
24
+ back ( nums , path , used )
25
+ return res
26
+ } ;
Original file line number Diff line number Diff line change
1
+ /**
2
+ * Definition for a binary tree node.
3
+ * function TreeNode(val, left, right) {
4
+ * this.val = (val===undefined ? 0 : val)
5
+ * this.left = (left===undefined ? null : left)
6
+ * this.right = (right===undefined ? null : right)
7
+ * }
8
+ */
9
+ /**
10
+ * @param {TreeNode } root
11
+ * @return {boolean }
12
+ */
13
+ var isValidBST = function ( root ) {
14
+ // 限定以 root 为根的子树节点必须满足 max.val > root.val > min.val
15
+ function isValidBST ( root , min , max ) {
16
+ // base case
17
+ if ( root === null ) return true ;
18
+ // 若 root.val 不符合 max 和 min 的限制,说明不是合法 BST
19
+ if ( min !== null && root . val <= min . val ) return false ;
20
+ if ( max !== null && root . val >= max . val ) return false ;
21
+ // 限定左子树的最大值是 root.val,右子树的最小值是 root.val
22
+ return isValidBST ( root . left , min , root )
23
+ && isValidBST ( root . right , root , max ) ;
24
+ }
25
+ return isValidBST ( root , null , null ) ;
26
+ } ;
Original file line number Diff line number Diff line change
1
+ /**
2
+ * @param {string } num
3
+ * @param {number } k
4
+ * @return {string }
5
+ */
6
+ var removeKdigits = function ( num , k ) {
7
+ let res = [ ] ;
8
+
9
+ for ( let i = 0 ; i < num . length ; i ++ ) {
10
+ // 移除栈中比当前数字大的元素,保证栈里的元素是递增的
11
+ while ( k > 0 && res . length > 0 && res [ res . length - 1 ] > num [ i ] ) {
12
+ res . pop ( ) ;
13
+ k -- ;
14
+ }
15
+ res . push ( num [ i ] ) ;
16
+ }
17
+ while ( k > 0 ) {
18
+ res . pop ( ) ;
19
+ k -- ;
20
+ }
21
+
22
+ let result = res . join ( '' ) . replace ( / ^ 0 + / , '' ) ;
23
+ return result . length === 0 ? '0' : result ;
24
+ } ;
You can’t perform that action at this time.
0 commit comments