Skip to content

Commit f7f0e1c

Browse files
committed
feat:76 402 3 46 98 438
1 parent 370db7d commit f7f0e1c

7 files changed

+191
-47
lines changed

labuladong/lesson-0/window/7-最小覆盖子串.js

-47
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
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 numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
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 numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
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+
};

leetcode/100/46-全排列.js

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
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+
};
+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
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+
};

leetcode/402-移掉k位数字.js

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
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+
};

0 commit comments

Comments
 (0)