美文网首页李特抠得LeetCode
LeetCode[1] - Longest Palindromi

LeetCode[1] - Longest Palindromi

作者: 土汪 | 来源:发表于2015-10-27 11:01 被阅读29次

    这个琢磨了我好半天。
    第一个方法至少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;
        }
    }
    
    
    
    
    
    
    

    相关文章

      网友评论

        本文标题:LeetCode[1] - Longest Palindromi

        本文链接:https://www.haomeiwen.com/subject/mkuxhttx.html