一:题目
二:结果代码
#include <stdio.h>
#include <string>
#include <iostream>
using namespace std;
int main(){
//注意无解情况
int flag=0;
string str;
cin >> str;
int length=str.length();
// begin_index+end_index=length-1
// 对称的个数为 length/2-1 (index从0开始,包含)
int number=length/2-1;
char first;
first=str[0];
char second;
second=str[1];
for(int i=1;i<=number;i++){
second=str[i];
if(second!=first){
swap(str[i],str[i-1]);
swap(str[length-1-i],str[length-1-i+1]);
flag=1;
break; //可以直接break
}else{
first=second;
}
}
if(flag==1){
cout << str;
}else{
cout << -1;
}
}
三:代码讲解
1:什么是回文字符:
中心对称就就是回文‘
2:左边对称字母的最后一个字母的索引:
是str.length()/2-1 (若数组从1开始则不用-1,数组从0开始就要减1);
3:两个对称字母的索引等式
设 begin_index 为左边字母索引,end_index为右边字母索引,
则有 begin_index+end_index=str.length()-1;
通过这个公式就可以获取另外一个字母的索引。
4:核心思路:
从左往右遍历左对称字母,若发现相邻字母不同则交换,再讲对称的两个不同字母交换就可以了。