早教吧 育儿知识 作业答案 考试题库 百科 知识分享

解出并解释一下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
▼优质解答
答案和解析
//说明:此程序编译通过的,你看看吧。最短交换的算法就是:交换从两端到中间,就是最优。
//算法思想具体如下:
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;
}
看了解出并解释一下C语言的这个题目...的网友还看了以下: