LeetCode[1] - Longest Palindromic Substring

这个琢磨了我好半天。
第一个方法至少O(n^3),果然时间太多,输了给了李特。这种方法从两头check (i,j),太慢。

第二个方法,是Code Granker上面的,利用了高中学排列组合时候的概念。有个‘abc’,那么总共可以看成’a_b_c’ 5个字符位置。分为两种情况: 一种是在’a|b’的间隙里面分割;一种是’abc’分割在’b’上。这样是O(2n-1)*O(n) = O(n^2),还不错。

方法三应该是DP。还没有细细研究。

/*
Given a string S, find the longest palindromic substring in S. 
You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.

Tags: String
Similar Problems: (H) Shortest Palindrome, (E) Palindrome Permutation

*/

/*
Attempt2: http://blog.csdn.net/linhuanmars/article/details/20888595, Code Granker

Assuming index x is the middle of the longest palindromic substring. Start from the middle, and check left,right indexes see if that are matching.

How many different index x can we check?
Think of string "abcd" as "a b c d", where the x can be any of 'a,b,c,d' character, and it can also just be in between of any two characters. That makes the total number of x to check: 2*n - 1. (n chars, and n-1 in-between space)

More details:
    When x is odd: x % 2 == 1, it's this pattern: a_b_c_d, for example x/2 = i lands on the 2nd space ' ', i == 3. 
    So: left = x/2 = 3 = ' '; right = x/2 = 3 = ' '. Right now, we are almost going to compare 'a_b' and '_c_d'.However, right needs to +1, because the we really want to compare 'a_b' and 'c_d'. We are split by the in-between-space, good to go.

    When x is even: x % 2 = 0, it's a_b_c, for example i lands on 'b', i ==2.
    So:left = x/2 = 2 = 'b'; right = x/2 = 2 = 'b'; We are splitting the string on 'b', it's okay. Then just split them like: 'a_' and '_c'.

    In conclusion: when x % 2 == 1: right = x/2 + 1;

Also, for each 'left' and 'right', start expanding left-- and right-- as long as they match the pattern of palindromic. Whenever failed to match, return whatever length of palindromic substring. 
Track the max length and max string.
*/

public class Solution {
    public String longestPalindrome(String s) {
        if (s == null || s.length() <= 1) {
            return s;
        }
        int x = 2 * s.length() - 1;
        String str = "";
        int max = 0;
        for (int i = 0; i < x; i++) {//Check through the 2*len - 1
            int left = i / 2;
            int right = i / 2;
            if (i % 2 == 1) {
                right++;
            }
            //Check Palindromic
            while(left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
                left--;
                right++;
            }
            String temp = s.substring(left + 1, right);
            //Track max
            if (temp.length() > max) {
                max = temp.length();
                str = temp;
            }
        }//END for
        return str;
    }
}

/*
1st Attempt.Thoughts:
Check palindromic with while(start < end){}.
Double-for loop on i ~ n.
Time: O(n^2 * n/2) = O(n^3)
*/
public class Solution {
    public String longestPalindrome(String s) {
        if (s == null || s.length() <= 1) {
            return s;
        }
        String rst = "";
        for (int i = 0; i < s.length(); i++) {
            for (int j = s.length() - 1; j > i; j--) {
                int start = i;
                int end = j;
                String str = s.substring(i,j + 1);
                boolean isPalindromic = true;
                while (start < end && isPalindromic) {
                    if (s.charAt(start) != s.charAt(end)) {
                        isPalindromic = false;
                    } else {
                        start++;
                        end--;
                    }
                }
                if (isPalindromic) {
                    if (str.length() > rst.length()) {
                        rst = str;
                    }
                }
            }
        }//END for
        return rst;
    }
}






    原文作者:张土汪
    原文地址: https://www.jianshu.com/p/8856b6200326
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞