牛客周赛 Round 30 C:小文构造回文详细讲解

一:题目

二:结果代码

#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:核心思路:

       从左往右遍历左对称字母,若发现相邻字母不同则交换,再讲对称的两个不同字母交换就可以了。

四:易错点

1: 注意有不存在新的回文数组输出-1的情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值