div.2/C. They Are Everywhere<two pointer>

来源:互联网 发布:网络常用英文缩写 编辑:程序博客网 时间:2024/06/15 20:28

题意:

给出包含n (3<=n<=100000)个字符的字符串,计算出包含所有类型字符的最小区间长度。

题解:

Two pointer.注意区间的处理。
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int maxn=100000+100;char s[maxn];int vis[1000+10];int l=0,r=0,num=0;int n,ty=0;int Find(char t,int pos)//向右查找所需要的字符{    for(;pos<n;pos++)    {        if(s[pos]==t)        {            vis[s[pos]]++;            return pos;        }        vis[s[pos]]++;    }    return 0;}int main (){    scanf("%d",&n);    scanf("%s",s);    for(int i=0;i<n;i++)//计算字符的种类    {        if(vis[s[i]]==0)            ty++;        vis[s[i]]++;    }    memset(vis, 0, sizeof(vis));    for(int i=0;i<n;i++)//寻找起始区间    {        if(vis[s[i]]==0)            num++;        vis[s[i]]++;        if(num==ty)        {            r=i;            break;        }    }    int ans=r+1;    for(int i=0;i<n;i++)    {        if(vis[s[i]]>1)        {            vis[s[i]]--;        }        else        {            ans=min(ans,r-i+1);            int p=Find(s[i],r+1);            if(p==0)                break;            else            {                r=p;                vis[s[i]]--;                ans=min(ans,r-i);            }        }    }    printf("%d\n",ans);    return 0;}
0 0
原创粉丝点击