LeetCode-5 Longest Palindromic Substring

题目

Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

Example 1:

Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.
Example 2:

Input: "cbbd"
Output: "bb"

解析

题目是要找出最长的回文字符串,拿到题目的第一反应是遍历子串,然后一直替换最长的子字符串即可了。
但是这种解法遇到极端输入状况就会超时,指定的最长长度为1000,遍历子串需要两次循环,判断回文需要一次循环,所以总的效率为O(n^3),那么极端状况会超时。

超时解法

    public String longestPalindrome(String s) {
        String longestStr = "";
        for(int start = 0 ; start<s.length() ; start++) {
            for(int end = start + longestStr.length()  ; end <= s.length() ;end++){
                String temp = s.substring(start,end);
                // 如果当前子字符串长度小于最长的,那么直接跳过
                if(longestStr.length() >= temp.length()){
                    continue;
                }
                if(checkStrValid(temp) && temp.length()>longestStr.length()){
                    longestStr = temp;
                }
            }
        }
        return longestStr;
    }
    private boolean checkStrValid(String s){
        if(s==null || s.length()==0){
            return false;
        }
        int start = 0 ,end = s.length()-1;
        while(start < end){
            if(s.charAt(start++)!=s.charAt(end--)){
                return false;
            }
        }
        return true;
    }

正确解法

     public String longestPalindrome2(String s) {
        // parameter[0]保存start的值,parameter[1]保存maxLen的值
        // 这样定义变量是为了实现java引用传递
        int[] parameter = new int[2];
        for(int i = 0 ; i < s.length() ; ++i){
            // 如果是奇数回文字符串,例如aba,bab,bbabb等
            searchPalindrome(s , i , i ,parameter);
            // 如果是偶数回文字符串,例如bbbb,baab,ceddec等
            searchPalindrome(s , i , i+1 , parameter);
        }
        // 等价于s.subString(start , start + maxLen)
        return s.substring(parameter[0],parameter[0] + parameter[1]);
    }

    private void searchPalindrome(String s , int left , int right , int[] parameter){
        // 寻找回文字符串
        while(left>=0 && right < s.length() && s.charAt(left) == s.charAt(right)){
            --left;
            ++right;
        }
        // 如果maxLen < 构造的回文子字符串长度
        if(parameter[1] < right - left - 1){
            // start = left + 1
            parameter[0] = left + 1;
            // maxLen = right - left - 1
            parameter[1] = right - left - 1 ;
        }
    }

定义int[] parameter的原因是为了支持函数引用传递,以免在searchPalindrome改变int参数值回到longestPalindrome2方法中值又回到原来的值,这是java方法参数值传递特性导致的。该方法效率为O(n^2)。

其他解法

还有一些比较巧妙的解法例如动态规划,马拉车算法等,目前还不能理解其中的精髓,等到我学会本质之后再补充,先贴个大神的博客放着。
https://www.cnblogs.com/grandyang/p/4464476.html

猜你喜欢

转载自www.cnblogs.com/benjamin4git/p/10112465.html