Acwing 双指针模板

87 阅读1分钟

image.png

image.png 代码:

image.png

799. 最长连续不重复子序列 - AcWing题库

思想

s[]用来统计次数 a[]用来存放数据

i和j都指向开始

s[a[i]]用来统计 a[]个数

s[a[j]]用来剔除 连续的 重复的子串的个数

最后 s[a[i]] s[a[j]]一加一减,s[]得到的就是题目要求的 连续的不重复的子串的个数

开始 image.png i++,当i走到第二个时,s[a[i]]=2 (因为2出现了两次)

那么j++,同时s[a[j]]--,剔除1出现的次数:

image.png 然后,此时重复值为2, j++;

image.png i和j区间内没有重复值了,i++。接下来一直都没有重复值,i一直++,一直到末尾:

image.png

#include<iostream>
using namespace std;

const int N=100010;
int a[N],s[N]; //a存输入数据  s是计数器

int main()
{
    int n=0;  int res=0;
    cin>>n;
    
    //输入数据
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }
    
   //开始比较
   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;
}