LeetCode题目:5. 最长回文子串 解题思路及Java实现

题目:
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:

输入: “cbbd”
输出: “bb”

思路:将字符串转为字符数组,定义两个指针,left和right分别指向第一个元素和第二个元素,right往后移,遍历数组,每次后移,判断left和right中间是否存在回文子串,存在的时候记录回文子串的长度和最左、最右两个字符的索引,下一次获取到回文子串的时候比较该回文子串和上一次的长度,如果更长,则更新长度,以及左边界和右边界的记录。

代码:

package code;

import java.util.ArrayList;

public class Demo05 {
    static String longestPalindrome(String s){
        if (s.length()<1)
            return null;
        int left = 0;
        int right = 1;
        int leftTemp;
        int rightTemp;
        int length = 0;
        int rightMax= 0;
        int leftMax = 0;
        boolean isPalindrome = true;
        ArrayList<Character> list = new  ArrayList<>();
        for (int i=0;i<s.length();i++){
            list.add(s.charAt(i));
        }
        while (right<list.size()){
            while (left < right){
                if (list.get(left) == list.get(right) && length < right -left){
                    leftTemp = left;
                    rightTemp = right;
                    //判断是否是回文串
                    while (rightTemp - leftTemp >=1){
                        if (list.get(rightTemp) != list.get(leftTemp)){
                            isPalindrome = false;
                            break;
                        }else {
                            rightTemp--;
                            leftTemp++;
                            isPalindrome = true;//这里要重置判断标志为true
                        }
                    }
                    if (isPalindrome){
                        if (right-left > length){
                            length =right-left;
                            rightMax = right;
                            leftMax = left;
                        }
                        break;
                    }
                }
                left++;
            }
            left = 0;
            right++;
        }
        StringBuilder sb = new StringBuilder();
        if (length != 0){
            for (int i=leftMax;i<=rightMax;i++){
                sb.append(list.get(i));

            }
            return sb.toString();
        }else {
            return sb.append(list.get(0)).toString();//没有长度大于2以上的回文串,就返回第一个字符
        }
    }

    public static void main(String[] args) {
        String str = longestPalindrome("acbcasdasdasd");
        System.out.println(str);
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值