CodeForces 701C They Are Everywhere (滑动窗口)

题目链接:http://codeforces.com/problemset/problem/701/C

题意:找到字符串中能包含所有元素的最短字符串长度。

利用“滑动窗口”解题

解题思路:

1. 遍历找到所有元素进行统计,元素数sum

2.设置两个”指针“ st、en,双重while 循环

3.先清空dp[]数组,进行统计

双重while

第一个 whielt(st<n)

{

  内部while(en<n&&sum!=sum1)//sum1统计元素个数

  {//内部while

    sum1 统计

    dp[s[en]]++ 每个元素出现的次数统计

    en++

  }

  如果sum==sum1 找到小值 ans=min(ans,en-st);

  *如果--dp[s[st]]==0,则说明 s[st] 这个元素在统计的所有元素个数中没有了,此时sum1--,即应重新统计s[st]  这个元素,以确保长度包含所有元素。【关键点】

  st++;

}

输出 asn 即可。

 

//16.09.07 22:10

看博再次看到滑动窗口,觉得解释的不算清晰,特补充解释下:

 

AC code:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int dp[300];
 4 int main()
 5 {
 6     int n;
 7     string s;
 8     while(~scanf("%d",&n))
 9     {
10         cin>>s;
11         int sum=0;
12         memset(dp,0,sizeof(dp));
13         for(int i=0; i<n; i++)
14         {
15             if(!dp[s[i]])
16             {
17                 dp[s[i]]=1;
18                 ++sum;
19             }
20         }
21         int st,en,sum1,ans;
22         st=en=sum1=0;
23         ans=1<<30;
24         memset(dp,0,sizeof(dp));
25         while(st<n)
26         {
27             while(en<n&&sum!=sum1)
28             {
29                 if(dp[s[en]]==0)
30                 {
31                     sum1++;
32                 }
33                 dp[s[en++]]++;
34             }
35             if(sum==sum1)ans=min(ans,en-st);
36             if(--dp[s[st++]]==0)sum1--;
37         }
38         cout<<ans<<endl;
39     }
40     return 0;
41 }

 

posted @ 2016-09-03 16:27  马丁黄瓜啊  阅读(334)  评论(0编辑  收藏  举报