《蓝桥杯算法》滑动窗口问题
一、最长不重复子序列
源代码:
#include <iostream>
#include <map>
#include <string>
using namespace std;
string s;
int l, r;
int match;
map<char, int > window;
int ans = 1 << 31;
int main()
{
cin >> s;
while(r < s.length()){
window[s[r]]++;
if(window[s[r]] == 1){
match++;
}
r++;
while(r - l != match){
if(s[l] != s[r]){
match--;
}
window[s[l]]--;
l++;
}
ans = max(ans, r - l);
}
cout << ans << endl;
return 0;
}
/*
abcabcbb
bbbbb
pwwkew
*/
二、字符串匹配
源代码:
#include <iostream>
#include <map>
#include <vector>
using namespace std;
string s, t; //s是开始串, t为目标串
int l, r; //双指针
vector<int > ans;
map<char, int > need; //记录目标串的字母出现的个数
map<char, int > window; //记录开始串的字母出现的个数
int match;
int main()
{
cin >> s >> t;
for(int i = 0; i < t.length(); i++){
need[t[i]]++;
}
while( r < s.length() && l <= r){
if(need.count(s[r])){
window[s[r]]++;
if(window[s[r]] == need[s[r]]){ //这个判断语句必须得有,有多个b
match++;
}
}
r++;
while(match == t.size()){
if(r - l == t.size()){
ans.push_back(l);
}
if(need.count(s[l])){
window[s[l]]--;
if(window[s[l]] < need[s[l]]){
match --;
}
}
l++;
}
}
for(int i = 0; i < ans.size(); i++){
cout << ans[i] << " ";
}
cout << endl;
return 0;
}
/*
cbaebabacd
abc
*/
/*
abab
ab
*/
三、字符串匹配2
源代码:
#include <iostream>
#include <map>
#include <string>
using namespace std;
string s, t; //存入开始串 和 目标串:字母一定各不相同
int start, mi = 1 << 30; //start记录最终串的最左边, mi是最终串的长度
string ans;
int match; //表示匹配的字母的个数
map<char, int > need; //记录目标串的每个字符的个数
map<char, int > window; //记录开始串的每个字符的个数 window在这里就是滑动窗口
int l, r; //双指针
int main()
{
cin >> s >> t;
if( t.length() == 0 && t.length() > s.length()){
ans = "";
}
for(int i = 0; i < t.length(); i++){
need[t[i]]++;
}
while(r < s.length() && l <= r){
//先找出字母符合条件的
if(need.count(s[r])){
window[s[r]]++;
if(window[s[r]] == need[s[r]]){ //这个判断语句也是必须要加的
match++;
}
}
r++;
//满足条件的情况下,找出最优解 使l++;
while(match == need.size()){
if(r - l < mi){
start = l;
mi = r - l;
}
if(need.count(s[l])){
if(window[s[l]] == need[s[l]]){ //这样才能做到匹配
match -- ;
}
window[s[l]]--;
}
l++;
}
}
ans = ((mi == 1 << 30) ? "" : s.substr(start, mi));
cout << ans <<endl;
return 0;
}
/*
ADOBECODEBANC
ABC
*/