题目链接: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 }