双指针
双指针算法时间复杂度是O(n)
for(i=0,j=0;i<n;i++){
while (j < i && check(i, j))j++;
}
例题:字符串输出比如: abc bcd edf 跳过空格输出
#include <iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
string a;
getline(cin, a);
for (int i = 0; i<a.size(); i++) {
int j = i;
while (j < a.size() && a[j] != ' ')j++;
for (int k = i; k < j; k++)
cout << a[k];
i = j;
cout << endl;
}
}
例题:求最大子字符串
每次i往后移动后再从上一个j到i循环,时间复杂度是2n,j每次都是最远的子字符串起点
#include <iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
const int N = 100010;
int n;
int a[N] ,s[N];
int main()
{
cin >> n;
for (int i = 0; i < n; i++)cin >> a[i];
int res = 0;
for (int i = 0,j=0; i < n; i++) {
s[a[i]]++;
while (s[a[i]] > 1) {
s[a[j]]--;
j++;
}
res = max(res, i - j + 1);
}
cout << res << endl;
}