最长回文字符串-Java实现

一、问题描述

回文字符串定义:如果一个字符串正着读和反着读是一样的,那它就是回文串例如:aba 、 abcba 。 
要求: 
给出一个字符串:asdsaasa 
返回一个最长的回文字符串:asdsa

二、解法(回文字符串为奇数)

public class Test {
    public static void main(String[] args) {
        String str = "sgfsasaopoiuydfghgfdtrewqirgabnirweir";
        System.out.println("答案是:"+searchMaxOddStr(str));
    }

    /**
     * 查询最长回文字符串。@author YYM
     * 只能查询到如"asdsa"类型的字符串(总长度为奇数)。
     * 而无法查询"asddsa"类型的(总长度为偶数)。
     * 若要查询asdsa类型的,请对原字符串数据进行处理。
     * @param str 待分析的字符串
     * @return 结果字符串
     */
    public static String searchMaxOddStr(String str) {
        if (str.equals("")) {
            return "";
        }
        String answer;//答案字符串
        int maxLen = 0;//存放当前回文字符串的"半径".
        int maxCenter = 0;//存放当前回文字符串的中心。
        int nowCenter=0;
        int nowLen =0;
        boolean flag = true;
        char[] list = str.toCharArray();
        for(nowCenter = 0;nowCenter< list.length;) {
            while(flag) {//开始执行一个中心点的判断
                if((nowCenter-nowLen)>=0 && nowCenter+nowLen<list.length) {//防止越界
                    if(list[nowCenter-nowLen]==list[nowCenter+nowLen]) {
                        if(maxLen<nowLen) {
                            maxLen = nowLen;
                            maxCenter = nowCenter;
                        }
                        nowLen++;
                    }else flag=false;
                }else flag =false;
            }
            nowCenter++;//判断下一个
            flag = true;//恢复初始状态
            nowLen=1;//恢复初始长度
        }
        answer = str.substring(maxCenter-maxLen,maxCenter+maxLen+1);//截取
        return answer;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

算法分析:由于是挨个遍历每个字符,然后往两边扩展比较,所以时间复杂度为O(n^2)..

三、如果最长回文是偶数呢?

简单,解决办法是把字符串每一个字符之间添加一个不可能出现在字符串中的符号,再传入方法里: 
如:asddsaasasa 
改成:#a#s#d#d#s#a#a#s#a#s#a# 
再传入上面写的方法,得到返回字符串后再去掉“#”即可。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值