双指针主要用于遍历数组,可以用于优化双重for循环,使得时间复杂度达到O(n),这里的指针不是指针变量,而是用于滑动指向不同元素。
以下为双指针的通用模板,利用一快一慢指针对中间的字符串进行操作
for(i=0,j=0;i<n;i++){
while(j<i&&check(i,j))j++;
//每道题的逻辑
}
例题
#include<iostream>
using namespace std;
const int N=100010;
int a[N],s[N];//s[N]用于每一个数出现的次数
int main()
{
int n;
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;
return 0;
}
3. 无重复字符的最长子串 - 力扣(LeetCode) (leetcode-cn.com)
当数据量较大时,也可以用哈希表统计子串中元素的个数,不必开辟过大的数组用于存储元素的个数。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_map<char,int>map;
int res=0;
//这里 i 为快指针,j 为慢指针
for(int i=0,j=0;i<s.size();i++){
map[s[i]]++;
//只要这个字符重复,应当在移动慢指针之前,把慢指针指向元素的个数减去
while(map[s[i]]>1){
map[s[j]]--;
j++;
}
res=max(res,i-j+1);
}
return res;
}
};