求解最大回文子字符串

//原题来自LeetCode

给定一个字符串,返回其中最长的回文子字符串

这道题目前目前受限于能力,暂时只能通过最暴力的解法来求得其解,即遍历子字符串,找出满足条件的解。下面是未曾优化过的代码,超出了时间限制的,囧(96 / 103 个通过测试用例

import java.util.ArrayList;
import java.util.List;

public class solution {
    public String longestPalindrome(String s) {
        String result = null;
        if(isPalindrome(s))
        {
            return s;
        }
        List<String> res = new ArrayList<String>();//直接用一个list容器,把所有满足条件的结果通通扔进去
        int index = s.length(); 
        int length = 0;
        for(int i = 0;i <= index; i++)
        {
            for(int j = index; j >= i; j--)
            {
                String temp = s.substring(i, j);
                if(isPalindrome(temp))
                {
                    res.add(temp);
                }
            }
        }
        
        for(String str : res)
        {
            if(str.length() >= length)
            {
                length = str.length();
                result = str;
            }
        }
        return result;
    }

    public boolean isPalindrome(String s)
    {
        int len = s.length();
        for(int i = 0; i < len / 2; i++)
        {
            if(s.charAt(i) != s.charAt(len-1-i))
            {
                return false;
            }
        }
        return true;
    }
}

这个思路很直接,不过就是要经过几次遍历,耗时太久,只能在此基础上进行优化:

import java.util.ArrayList;
import java.util.List;

public class solution {
    public String longestPalindrome(String s) {
        String result = "";
        if(isPalindrome(s))
        {
            return s;
        }
        int index = s.length(); 
        int length = 0;
        for(int i = 0;i <= index; i++)
        {
            for(int j = index; j >= i; j--)
            {
                String temp = s.substring(i, j);
                if(isPalindrome(temp)&& temp.length() > length)
                {
                    length = temp.length();
                    result = temp;
                    break; //在此跳出循环的原因是我从字符串的最末端开始遍历,遇到的第一个满足条件的,长度肯定是最长的
                }
//在剩余的字符串的长度比目前的result要短时也不用比较了,即使有回文串,长度也不会比当前的result要长
if(j - i >= length) { break; } } } return result; } public boolean isPalindrome(String s) { int len = s.length(); for(int i = 0; i < len / 2; i++) { if(s.charAt(i) != s.charAt(len-1-i)) { return false; } } return true; } }

这个目前还真的没有想到其他巧妙的解法,只能日后求助大神再作优化。

猜你喜欢

转载自www.cnblogs.com/WakingShaw/p/11306095.html