早教吧作业答案频道 -->其他-->
解出并解释一下C语言的这个题目(完美的代价)完美的代价回文串是一种特殊的字符串,它从左往右读和从右往左读是一样的,有人认为回文串是一种完美的字符串。现在给你一个字符串,
题目详情
解出并解释一下C语言的这个题目(完美的代价)
完美的代价
回文串是一种特殊的字符串,它从左往右读和从右往左读是一样的,有人认为回文串是一种完美的字符串。现在给你一个字符串,它不一定是回文的,请你计算最少的交换次数使得该字符串变成一个回文串。这里的交换指将字符串中两个相邻的字符互换位置。
例如所给的字符串为”mamad”,第一次交换a和d,得到”mamda”,第二次交换m和d,得到”madma”;第三次交换最后面的m和a,得到”madam”。
编写程序,从键盘读入数据。第一行是一个整数N(N <= 80),表示所给字符串的长度,第二行是所给的字符串,长度为N且只包含小写英文字母。如果所给字符串能经过若干次交换变成回文串,则输出所需的最少交换次数;否则,输出Impossible。
输入输出示例1
5
mamad
3
输入输出示例2
6
aabbcd
Impossible
完美的代价
回文串是一种特殊的字符串,它从左往右读和从右往左读是一样的,有人认为回文串是一种完美的字符串。现在给你一个字符串,它不一定是回文的,请你计算最少的交换次数使得该字符串变成一个回文串。这里的交换指将字符串中两个相邻的字符互换位置。
例如所给的字符串为”mamad”,第一次交换a和d,得到”mamda”,第二次交换m和d,得到”madma”;第三次交换最后面的m和a,得到”madam”。
编写程序,从键盘读入数据。第一行是一个整数N(N <= 80),表示所给字符串的长度,第二行是所给的字符串,长度为N且只包含小写英文字母。如果所给字符串能经过若干次交换变成回文串,则输出所需的最少交换次数;否则,输出Impossible。
输入输出示例1
5
mamad
3
输入输出示例2
6
aabbcd
Impossible
▼优质解答
答案和解析
//说明:此程序编译通过的,你看看吧。最短交换的算法就是:交换从两端到中间,就是最优。
//算法思想具体如下:
1、从左边第i的字符串开始逐个开始与x比较是否相等
2、在字符串右边第n-i-1个位置开始,向左寻找与之相同的字符。
3、找到字符后将其逐个向右移动,统计交换次数
当遇到奇数字母时,反向搜索。见代码。即看2’的算法
2‘、在字符串左边第i个位置开始,向右寻找与第n-i-1位置相同的字符。
#include
int changes(char s[],char x,int n);
char x='0';
void main()
{
int n,i,k=0,b[26]={0},j;
char y,s[8001]={0};
scanf("%d",&n);
getchar();
for(i=0;i scanf("%c",&s[i]);
for(i=0;i j=s[i]-'a';
b[j]++;
}
for(j=0;j<26;j++){/*如果所有字母出现偶数次,那么该字符串可以进行字符间的交替,成为回文串。即(b[j]%2!=0);*/
if(b[j]%2!=0){//统计共有几个奇数字母
k++;
x=j+'a';//x是奇数字母(一个奇数字母的时候有用)
}
}
if(k>=2)/*如果有两个字母或者两个字母以上出现了奇数次,那么该字符串不能通过字符间的交替成为回文串。*/
printf("Impossible\n");
else
printf("%d\n",changes(s,x,n));
}
int changes(char s[],char x,int n)//统计交换次数
{
int i,change=0,j,k;
for(i=0;i if(s[i]==x){//当遍历到奇数字母时,可以以回文对应位置的字母来交换
for(j=i;j if(s[n-i-1]==s[j])
break;
change+=j-i;
for(k=j;k>i;k--)
s[k]=s[k-1];
s[i]=s[n-i-1];
}
else//否则,以左边字母进行交换次数统计
{
for(j=n-i-1;j>=i;j--)
if(s[i]==s[j])
break;
change+=n-i-1-j;
for(k=j;k s[k]=s[k+1];
s[n-i-1]=s[i];
}
}
return change;
}
//算法思想具体如下:
1、从左边第i的字符串开始逐个开始与x比较是否相等
2、在字符串右边第n-i-1个位置开始,向左寻找与之相同的字符。
3、找到字符后将其逐个向右移动,统计交换次数
当遇到奇数字母时,反向搜索。见代码。即看2’的算法
2‘、在字符串左边第i个位置开始,向右寻找与第n-i-1位置相同的字符。
#include
int changes(char s[],char x,int n);
char x='0';
void main()
{
int n,i,k=0,b[26]={0},j;
char y,s[8001]={0};
scanf("%d",&n);
getchar();
for(i=0;i
for(i=0;i
b[j]++;
}
for(j=0;j<26;j++){/*如果所有字母出现偶数次,那么该字符串可以进行字符间的交替,成为回文串。即(b[j]%2!=0);*/
if(b[j]%2!=0){//统计共有几个奇数字母
k++;
x=j+'a';//x是奇数字母(一个奇数字母的时候有用)
}
}
if(k>=2)/*如果有两个字母或者两个字母以上出现了奇数次,那么该字符串不能通过字符间的交替成为回文串。*/
printf("Impossible\n");
else
printf("%d\n",changes(s,x,n));
}
int changes(char s[],char x,int n)//统计交换次数
{
int i,change=0,j,k;
for(i=0;i
for(j=i;j
break;
change+=j-i;
for(k=j;k>i;k--)
s[k]=s[k-1];
s[i]=s[n-i-1];
}
else//否则,以左边字母进行交换次数统计
{
for(j=n-i-1;j>=i;j--)
if(s[i]==s[j])
break;
change+=n-i-1-j;
for(k=j;k
s[n-i-1]=s[i];
}
}
return change;
}
看了解出并解释一下C语言的这个题目...的网友还看了以下:
下列有关生物的变异的叙述不正确的是()A.包括病毒在内的所有生物都可能发生基因突变B.可遗传变异不 2020-05-14 …
A树心有泪B西下美女C手扶下巴D人在尔边E生死想依F言及自己G十雨具下H白色勺子I儿女双全J又住一 2020-05-14 …
下图代表中、印、美三国近年新增人口结构图。读图回答13一14题。小题1:图甲、图乙、图丙对应的国家 2020-06-27 …
被子植物和裸子植物的共同特征是()A.都能产生果实,种子外面有果皮包被B.都能产生种子,通过种子繁 2020-07-06 …
1.美国能够成为世界超级大国,根源于经济的高速发展,其经济史上“繁荣的十年”是在20世纪的A:40 2020-07-21 …
阅读下面的文章,完成下列各题。审美洪晃①说到审美,大家都认为很深奥。其实审美代表着一种生活方式,而生 2020-12-05 …
下列关于近代欧美代议制确立和发展的表述,正确的是A.工业革命为欧美代议制的确立和发展奠定了坚实的物质 2020-12-18 …
谁会这道题:美国成为世界上最大的美国成为世界上最大的债务国是在[]A.20世纪50年代B.20世纪7 2020-12-26 …
微观经济学试题一单选题1、经济学中“资源稀缺”是指()。A世界上大多数人生活在贫困中b资源必须留给下 2021-01-18 …
下列有关环境对生物性状影响的叙述中,正确的是()A.后天获得的性状,其出现频率都符合孟德尔定律B.环 2021-01-23 …