题目链接:https://vjudge.net/contest/173017#problem/H
题意:给定一个字符串通过操作
1.修改字符串中的一个字符
2.在字符串结尾的时候添加一个字符
来判断成为回文串所需要的步数为多少
思路:要成为回文串则对应位置应该相同,首先将字符串倒置,然后依次比较得到的挪位数(在字符串结尾添加字符)+字符不同数
考虑到回文串的对称关系,移动的步数最多为字符串长度/2
abcdefgded
dedgfedcba 挪位数:0 字符不同个数:10 (由于对称关系,我们只需改变5个字符即可达到回文效果) 步数:2+5=7
abcdefgded
dedgfedcba 挪位数:1 字符不同个数:6 步数:1+3=4
abcdefgded
dedgfedcba 挪位数:2 字符不同个数: 8 步数: 2+4=6
abcdefgded
dedgfedcba 挪位数:3 字符不同个数: 2 步数: 3+1=4
abcdefgded
dedgfedcba 挪位数:4字符不同个数: 6 步数: 4+3=7
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
char str[205];
int main()
{
while(gets(str)!=NULL){
int len=strlen(str),ans=len/2;
for(int i=0;i<len;i++)
{
int s=i,e=len-1,sum=i;//s为首 e为尾 sum为挪位数
while(s<len){
if(str[s]!=str[e]&&s<=e) sum++; //如果不匹配执行操作1
s++; e--; //指针变化
}
if(sum<ans) ans=sum;
}
printf("%d\n",ans);
}
}