现有字母a-z(不分大小写),可以为这些字母分配1-26的权值。
给定两个字符串,由a-z组成,字符串的权值等于所有字符的权值相加,问怎么样分配权值,才能使两个字符串的差值最大。
#include<iostream>
#include<string>
using namespace std;
const len=26;
int main()
{
char *p1=new char[50];
char *p2=new char[50];
char *r=new char[60];
char *head=r;
gets(p1);
gets(p2);
int n1[len]={0},n2[len]={0},d=0,key=0,f1=0,f2=1,res[26]={0};
//将p1,p2中每个字母出现的次数分别记录在n1和n2数组中。a-z对应下标0-25。包括将其中的大写字母转化为小写。
while(*p1!='\0')
{if(*p1<'a')
*p1+=32;
n1[(*p1-'a')]++;
p1++;}
while(*p2!='\0')
{if(*p2<'a')
*p2+=32;
n2[(*p2-'a')]++;
p2++;}
//for(int kk=0;kk<len;kk++)
//cout<<n1[kk]<<' ';
//将p1和p2中相同的字符抵消。
for(int i=0;i<len;i++)
{
d=((n1[i]<=n2[i]) ? n1[i]:n2[2]);
n1[i]-=d;
n2[i]-=d;
}
//对p1中的字符,按该字符出现的次数分配权值,次数最多的分配26,次多的分配25,依次递减。
d=0;
while(1)
{
for(int i=0;i<len;i++)
if(d<n1[i])
{ d=n1[i];
key=i;
}
if(d==0)
break;
n1[key]=0;
res[key]=len-f1;
f1++;
d=0;
}
//对p2中的字符,按该字符出现的次数分配权值,次数最多的分配1,次多的分配2,依次递增。
d=0;
while(1)
{
for(int i=0;i<len;i++)
if(d<n2[i])
{ d=n2[i];
key=i;
}
if(d==0)
break;
n2[key]=0;
res[key]=f2;
f2++;
d=0;
}
//将未分配的字符予以分配,并将结果存入字符串r中。
for(int j=0;j<len;j++)
{
if(res[j]==0)
{
res[j]=f2;
f2++;
}
sprintf(r,"%c%d",'a'+j,res[j]);
r+=strlen(r);
}
cout<<head;
}