序号:1800
黑心商家
Time Limit:1s Memory Limit:128MB
题目描述
在一个风和日丽的下午,小非在街边看到了一个地摊,地摊上摆放了一些手办。
小非觉得这些手办很好看,因此打算把每种不同的手办都每一个放家里观赏。
但是店家强制要求只能买连续的几个手办,小非为了抗击这股“黑势力”,同时又想要每种不同款式的手办,请问小非最少需要买几个手办?
输入格式
输入共一行,包含一个字符串,不同字符表示不同款式的手办,手办最多有52种(0-25用'a'-'z'表示,26-51用'A'-'Z'表示)
输出格式
输出一个整数,表示小非最少需要买的手办数。
输入输出样例
输入 #1
abbcb
输出 #1
4
说明/提示
数据规模与约定
对于全部的测试点,保证1≤字符串长度≤10的6次方。
#include<bits/stdc++.h>
using namespace std;
int n,vis[200],m,ans=99999999;
string s;
int main(){
ios::sync_with_stdio(false);
cin>>s;
n=s.size();
for(int i=0;i<n;i++){
if(!vis[s[i]-'A']){
vis[s[i]-'A']++;
m++;
}
}
int l,r;
l=r=0;
while(l<n and r<n and l<=r){
memset(vis,0,sizeof vis);
int k=0;
r=l;
while(r<n and k<m){
if(!vis[s[r]-'A']){
k++;
}
vis[s[r]-'A']++;
r++;
}
while(l<=r and k==m){
vis[s[l]-'A']--;
if(vis[s[l]-'A']==0){
k--;
}
l++;
}
if(k==m-1){
ans=min(r-l+1,ans);
}
}
cout<<ans;
return 0;
}