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

题意:

给出包含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;
}
posted @ 2016-07-28 09:37  _Mickey  阅读(103)  评论(0编辑  收藏  举报