let s = "ABBBBCCGGGGSBCG", t = 'GBC'
function minWindow(s, t) {
let l = 0, r = 0, tl = t.length, res = '', set = new Set(), window = new Map();
for (let i = 0; i < tl; i++) {
set.add(t[i])
window[t[i]] = 0
}
let valid = 0;
while (r < s.length) {
let ts = s[r]
if (set.has(ts)) {
window[ts]++
if (window[ts] === 1) {
valid++
}
}
if (valid === set.size) {
while (l < r) {
if (set.has(s[l])) {
if (window[s[l]] === 1) {
const t = s.substring(l, r + 1)
if (!res) {
res = t
}
res = res.length > t.length ? t : res
window[s[l]] = 0
l++
valid--
break
}
window[s[l]]--
}
l++
}
}
r++
}
return res
}
使用递归,效率低下
let S = "BANBCHFGM"
var T = "NBBG"
function name(a, b, L=0) {
var bool ;
if(L+b.length>a.length) return "没有"
for (var i = 0; i <= a.length - b.length-L; i++) {
bool=true
var string = a.substring(i, i + b.length + L )
for (var j = 0; j < b.length; j++) {
if (!string.includes(b[j])){ bool = false ; break }
}
if (bool) { return string }
}
return name(a, b, L + 1)
}
console.log(name(S, T));
滑动窗口
1、在序列中使用双指针中的左右指针技巧,初始化 left = right = 0,把索引闭区间 [left, right] 称为一个窗口。
2、先不断地增加 right 指针扩大窗口 [left, right],直到窗口中的序列符合要求。
3、此时,停止增加 right,转而不断增加 left 指针缩小窗口 [left, right],直到窗口中的序列不再符合要求。同时,每次增加 left前,都要更新一轮结果。
4、重复第 2 和第 3 步,直到 right 到达序列的尽头。
思路其实很简单:第 2 步相当于在寻找一个可行解,然后第 3 步在优化这个可行解, 每一步都在基于当前一个目标数据包含于新开头的子数据的数据找到最优解。左右指针轮流前进,窗口大小增增减减,窗口不断向右滑动。 ↩︎