早教吧作业答案频道 -->其他-->
解出并解释一下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语言的这个题目...的网友还看了以下:
求一个比较地道的美式回答当为你提供服务的人员说:IsthereanythingelseIcanhe 2020-05-17 …
爸爸昨天才从万里之遥的美国回到阔别多年的故乡强调回乡时间不长,重音在“”上 2020-06-13 …
英语翻译在这里,你不仅可以看到美丽的风景,领略历史悠久的闽南文化,还可以体会到当地人民的热情好客. 2020-06-26 …
“小青荷”,是对G20杭州峰会志愿者的“昵称”,她们被誉为“峰会上最美丽的风景”。“最动人”的小青 2020-06-29 …
在下面横线处补写恰当的语句,使整段文字语意完整连贯,内容贴切,逻辑严密,每处不超过15个字。语言的 2020-07-24 …
在文中横线处填上恰当的虚词,使整段文字语意连贯起来。语言的形式,①能是美的,②它有整齐的美,抑扬的 2020-07-24 …
拜托,有谁帮我把下面这段话添上关联词语?语言的形式(1)是美的,(2)它有整齐的美,抑扬的美,回环 2020-07-24 …
在文中横线处填上恰当的关联词语,使上下文连贯起来。将答案写在文段下面对应的序号后。语言的形式,①能 2020-07-24 …
在下面横线处补写恰当的语句,使整段文字语意完整连贯,内容贴切,逻辑严密,每处不超过15个字。语言的 2020-07-24 …
在横线处补写出恰当的语句。语言的形式之所以能是美的,因为它有整齐的美、抑扬的美、回环的美。,所以语 2020-07-24 …