双指针问题2(c++)
概念
双指针,顾名思义,就是用两个指针解决问题。
有些问题用单指针会出现超时等问题,这时就需要用到双指针
一般,双指针是由一个快指针和一个慢指针组成
快指针不断得增加,如果遇到某个特殊条件。那么慢指针也增加
通过这种方式,可以有效化解许多超时问题
题目
(续上一篇,如需了解上一篇题目,请移步主页观看)
4.最小覆盖字串

#include <bits/stdc++.h>
#define ll long long
using namespace std;
string a,b;
int fast,slow;
int tongt[130];
int tong[130];
string mi;
int lmi;
string sum;
int lsum;bool fugai();
int main()
{cin>>a>>b;for(int i = 0;i<b.size();i++){tongt[b[i]]++;}lmi = 999999999;mi = "";fast = -1;slow = 0;while(fast==-1||fast<a.size()-1){while(fast==-1||fast<a.size()-1){fast++;tong[a[fast]]++;sum = sum+a[fast];lsum++;if(fugai()==true){if(lsum<lmi){lmi = lsum;mi = sum;}break;}}while(slow<fast){tong[a[slow]]--;slow++;sum = sum.substr(1,sum.size()-1);lsum--;if(fugai()==true){if(lsum<lmi){lmi = lsum;mi = sum;}}else break;}}cout<<mi;return 0;
}
bool fugai()
{for(int i = 60;i<130;i++){if(tongt[i]>0&&tong[i]<tongt[i]) return false;}return true;
}5.最小子数组和

#include <bits/stdc++.h>
#define ll long long
using namespace std;
int n;
int a[1000010];
ll t;
int fast,slow;
int main()
{cin>>n>>t;for(int i = 1;i<=n;i++){cin>>a[i];}int mi = 999999999;ll sum = 0;slow = 1;while(fast<=n){while(fast<=n){sum += a[++fast];if(sum>=t){mi = min(mi,fast-slow+1);break;}}while(slow<=fast){sum -= a[slow];slow++;if(sum>=t) mi = min(mi,fast-slow+1);if(sum<t) break;}}cout<<mi;return 0;
}