for(i =0; i < n; i ++){while(j <= i &&check(j, i)) j ++;
具体业务逻辑
}
1. 将字符串abc def ghi以空格分隔输出
for(int i =0; i < s.size(); i ++){int j = i;while(j < n && s[j]!=' ') j ++;for(int k = i; k < j; k ++) cout << s[k];
cout << endl;
i = j;}
2. 求最长的连续的不重复的子序列
[j,i]区间内始终维护不重复子序列
i指针往区间加入新元素; j指针剔除区间内元素; s数组记录区间内元素的出现次数
#include<iostream>usingnamespace std;constint N =1e5+10;int q[N], s[N];intmain(){int n;
cin >> n;for(int i =0; i < n; i ++)scanf("%d",&q[i]);// [j,i]区间内始终维护不重复的元素int res =0;for(int i =0, j =0; i < n; i ++){// i遍历数组,每次都在[j,i]中加入一个新元素; s数组记录[j,i]区间内元素的出现次数
s[q[i]]++;// 新加入的元素在[i,j]内重复出现时,移动j来剔除[j,i]之间的元素,直到重复元素被剔除while(s[q[i]]>1){
s[q[j]]--;
j ++;}// 每次移动指针后都更新[j,i]区间中的元素个数
res =max(res, i - j +1);}
cout << res << endl;return0;}
#include<iostream>usingnamespace std;constint N =1e5+10;int a[N], b[N];intmain(){int n, m, x;
cin >> n >> m >> x;for(int i =0; i < n; i ++)scanf("%d",&a[i]);for(int i =0; i < m; i ++)scanf("%d",&b[i]);// 双指针for(int i =0, j = m -1; i < n && j >=0; i ++){while(j >=0&& a[i]+ b[j]> x) j --;if(a[i]+ b[j]== x)printf("%d %d\n", i, j);}return0;}
4. 找一个序列中是否包含指定子序列:
i 指针指向子数组a; j指针指向父数组b
i 指向子数组a中的元素,在父数组b中找相匹配的元素; 若在b中能找到,则i后移
#include<iostream>usingnamespace std;constint N =1e5+10;int a[N], b[N];intmain(){int n, m;
cin >> n >> m;for(int i =0; i < n; i ++)scanf("%d",&a[i]);for(int i =0; i < m; i ++)scanf("%d",&b[i]);// 双指针int i, j;for(i =0, j =0; i < n && j < m; j ++)if(a[i]== b[j])
i ++;if(i == n) cout <<"Yes"<< endl;else cout <<"No"<< endl;return0;}