题目:
我们要给每个字母配一个1-26之间的整数,具体怎么分配由你决定,但不同字母的完美度不同,
而一个字符串的完美度等于它里面所有字母的完美度之和,且不在乎字母大小写,也就是说字母F和f的完美度是一样的。
现在给定一个字符串,输出它的最大可能的完美度。
例如:dad,你可以将26分配给d,25分配给a,这样整个字符串最大可能的完美度为77。
疑问:
程序里面我注意到存在其它字符还有大小写的问题,可提交后测试用例还是不对,不知道是哪里错了,还请帮忙指出
bool IsRange(char a)
{
if(('a'<=a&&a<='z')||('A'<=a&&a<='Z'))
return 1;
return 0;
}
bool IsEqual(char a,char b)
{
int num='A'-'a';
if(a-b==num||b-a==num)
return 1;
else
return 0;
}
void sort(int *a) //出现的次数升序
{
while(*a!=0)
{
int *p=a;
while(*p!=0)
{
p++;
if(*p>*a)
{
int temp;
temp=*a;
*a=*p;
*p=temp;
}
}
a++;
}
}
bool IsApp(char *q,char a) //1-存在,0—不存在
{
while(*q!='\0')
{
if(*q==a||IsEqual(*q,a))
return 1;
q++;
}
return 0;
}
int perfect(const string &s)
{
int count,sum=0,i=0,j=0;
int WordAppNub[26]={0}; //存放字母出现的次数
char WordApp[26]={'0'}; //存放出现过的字母
int Num[26]; //完美值1—26
const char *p=&s[0];
for(int i=26;i>0;i--)
{
Num [26-i]=i;
}
while(*p!='\0')
{
count=0;
while((*p!='\0')&&(IsApp (WordApp ,*p)||(!IsRange (*p))))
{
p++;
}
if(*p!='\0'&&(!IsApp (WordApp ,*p)))
{
const char *q=p;
while(*q!='\0')
{
if(*p==*q||IsEqual (*p,*q))
{
count++;
q++;
}
else
q++;
}
WordAppNub[i++]=count;
WordApp[j++]=*p;
p++;
}
}
sort(WordAppNub);
for(int i=0;i<26;i++)
{
sum+=WordAppNub [i]*Num[i];
}
/*for(int i=0;i<26;i++)
{
int WordAppNub[26]={0};
char WordApp[26]={'0'};
}*/
return sum;
}
int _tmain(int argc, _TCHAR* argv[])
{
int SumNub;
const string a="24a5b6e 5d8d c7A24 44F8F6D42f33f42D99tF45f24C56f58fe86BF25ad25B36db42b";
SumNub=perfect (a);
cout<<SumNub<<endl;
system("pause");
return 0;
}