题目描述
LZY又来写程序模拟随机字符串了,你们是不是很想揍他?先别急,先AC这题再揍。LZY今天又模拟了一串随机字符串,他想让你们帮帮他,把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段。输出每一个字符串片段的长度。
输入
测试数据由多组测试样例组成。每组测试样例第一行输入一个字符串 s ( 1 <= s.length <= 1000000),字符串中只存在 小写字母 a —— z
输出
输出分离后每个字符串片段的长度
样例输入 Copy
ababcbacadefegdehijhklij
样例输出 Copy
9 7 8
思路:
水题++
把所有字母的末尾提取出来,如果跑循环的时候发现在所包含的里面的字母里有末端数字超过之前保留的情况就变数据。
if ( a[d] > max1 ) max1 = a[d] ;
AC代码:
#include<bits/stdc++.h>
using namespace std;
string s;
int a[26],d,f,max1,c;
int b[26];
int main(){
while(cin>>s){
memset(a,0,sizeof a);
memset(b,0,sizeof b);
for(int i=0;i<s.length();i++){
d=s[i]-'a';
a[d]=i;
}
f=0;
c=0;
d=s[0]-'a';
max1=a[d];
for(int i=0;i<s.length();i++){
f++;
d=s[i]-'a';
if(i==max1){
b[c]=f;
c++;
f=0;
d=s[i+1]-'a';
max1=a[d];
}
if(a[d]>max1){
max1=a[d];
}
}
cout<<b[0];
for(int i=1;i<c;i++){
cout<<" "<<b[i];
}cout<<endl;
}
return 0;
}