《蘑菇街编程题》回文串

题目:给定一个字符串,问是否能通过添加一个字母将其变为回文串。

输入描述:
一行一个由小写字母构成的字符串,字符串长度小于等于10。

输出描述:
输出答案(YES\NO).

输入例子1:
coco

输出例子1:
YES

解析:思路是求得最大的回文子串,然后看最大的回文子串是否等于字符串的长度减1,如果等于,返回YES,否则返回NO

import java.util.Scanner;

/**
 * Created by HP on 2017/8/4.
 */
public class Main {

    //ceabadd
    //abba
    public static String maxPalinedrom(String s){
        int max=0;
        int left=0,right=0;
        for(int i=0;i<s.length();i++){//最大回文是奇数的情况
            int leftIndex=i-1;
            int rightIndex=i+1;
            while (leftIndex>=0&&rightIndex<s.length()){
                if(s.charAt(leftIndex)==s.charAt(rightIndex)){
                    leftIndex--;
                    rightIndex++;
                }else {
                    break;
                }
            }
            leftIndex++;
            rightIndex--;
            if((rightIndex-leftIndex+1)>=max){
                max=rightIndex-leftIndex+1;
                left=leftIndex;
                right=rightIndex;
            }
        }
        for(int i=0;i<s.length();i++){//最大回文是偶数的情况//abba
            int leftIndex=i;
            int rightIndex=i+1;
            while (leftIndex>=0&&rightIndex<s.length()){
                if(s.charAt(leftIndex)==s.charAt(rightIndex)){
                    leftIndex--;
                    rightIndex++;
                }else {
                    break;
                }
            }
            leftIndex++;
            rightIndex--;
            if((rightIndex-leftIndex+1)>=max){
                max=rightIndex-leftIndex+1;
                left=leftIndex;
                right=rightIndex;
            }
        }
        if(max==s.length()-1){
            return "YES";
        }
        //return s.substring(left,right+1);//题目并不要求输出最大回文子串,但是可以求得的最大连续子回文子串
        return "NO";
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()){
            System.out.println(maxPalinedrom(sc.next()));
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值