滑动窗口思想
模板
/* 滑动窗口算法框架 */
func slidingWindow(_ s: String, _ t: String) {
let sArray = [Character](s)
var win = Dictionary<Character, Int>() // 保存滑动窗口字符集
var need = Dictionary<Character, Int>() // 保存需要的字符集
for c in t {
need[c, default: 0] += 1
}
var left = 0 ,right = 0 // 窗口
var valid = 0 // 匹配次数
while right < sArray.count {
// rightItem 是将移入窗口的字符
let rightItem = sArray[right]
// 右移窗口
right += 1
// 进行窗口内数据的一系列更新
...
/*** debug 输出的位置 ***/
print("window: [\(left), \(right))\n", left, right);
/********************/
// 判断左侧窗口是否要收缩
while (window needs shrink) {
// d 是将移出窗口的字符
let leftItem = sArray[left]
// 左移窗口
left += 1
// 进行窗口内数据的一系列更新
...
}
}
}
/* 滑动窗口算法框架 */
void slidingWindow(string s, string t) {
unordered_map<char, int> need, window;
for (char c : t) need[c]++;
int left = 0, right = 0;
int valid = 0;
while (right < s.size()) {
// c 是将移入窗口的字符
char c = s[right];
// 右移窗口
right++;
// 进行窗口内数据的一系列更新
...
/*** debug 输出的位置 ***/
printf("window: [%d, %d)\n", left, right);
/********************/
// 判断左侧窗口是否要收缩
while (window needs shrink) {
// d 是将移出窗口的字符
char d = s[left];
// 左移窗口
left++;
// 进行窗口内数据的一系列更新
...
}
}
}示例
总结
练习
最后更新于