讨论/系统设计/牛的速记(求优化代码)/
牛的速记(求优化代码)

大家好,我的问题是牛的速记,题目是:
题目地址:http://oj.jzxx.net/problem.php?id=1311
题目描述
奶牛们误解了速记的含义。他们是这样理解的: 给出一个少于250个字母的小写字母串。 找到一个出现次数最多的字母,将该字母从字母串中统统删去,如果出现次数最多的字母不止一个,就删去在字母表中靠前的一个,即序号小的那个,已知a的序号为97,b的序号为98,c的序号为99,以此类推。 然后输出这个字符串,重复上面的操作,直到字符串中没有字符。当然,你不应该输出最后的空串。 虽然他们误解了,但是这却是一个非常好的程序设计想法。用你的程序实现这个过程!

输入
包含一行,即这个字符串。

输出
一些连续的字符串(如题目中描述的),每行一个字符串。

样例输入 复制
maryhadalittlelambitsfleecewaswhite
样例输出 复制
mryhdlittlelmbitsfleecewswhite
mryhdlittllmbitsflcwswhit
mryhdittmbitsfcwswhit
mryhdimbisfcwswhi
mryhdmbsfcwswh
mrydmbsfcwsw
rydbsfcwsw
rydbfcww
rydbfc
rydfc
rydf
ryf
ry
y
我的时间超限,帮我解决一下吧,大神们!!!(帮我优化一下代码吧)
#include<bits/stdc++.h>
using namespace std;
int s[26];
int zdsc(string a,int n){
int i,max=0;
for(i=0;i<26;i++)
s[i]=0;
for(i=0;i<n;i++)
s[(a[i])-97]++;
for(i=0;i<26;i++)
if(s[i]>max)
max=s[i];
for(i=0;i<26;i++)
if(s[i]==max)
return i+97;
}
int pd(string a,int n){
int i,s;
s=(int)a[0];
for(i=1;i<n;i++)
if((int)a[i]!=s)
return 1;
return 0;
}
int main(){
string a;
int n,i,j,k,sss;
getline(cin,a);
n=a.length();
for(i=0;pd(a,n);i++){
sss=zdsc(a,n);
for(j=0;j<n;j++)
if((int)a[j]==sss){
for(k=j;k<n-1;k++)
a[k]=a[k+1];
a[k]=0;
n--;
j--;
}
cout<<a<<endl;
}
return 0;
}
万分感谢!!!

展开讨论

把代码用大括号(代码块)括起来,然后预览下,再发.
思路:
1)计数,排序,遍历过滤,拼接.递归.
用python写的话,collections模块就差不多了~

1