首页 > 代码库 > [LeetCode]5 Longest Palindromic Substring

[LeetCode]5 Longest Palindromic Substring

https://oj.leetcode.com/problems/longest-palindromic-substring/

http://fisherlei.blogspot.com/2012/12/leetcode-longest-palindromic-substring.html


public class Solution {
    public String longestPalindrome(String s) {
        
        // Solution A:
        return longestPalindrome_Center(s);
    }
    
    ///////////////////////////////////////
    // Solution A: Center
    // 
    // 遍历每一个字符,寻找以此字符为中心,最长的回文
    // O(n ^ 2)
    public String longestPalindrome_Center(String s) 
    {
        if (s == null || s.length() == 0 || s.length() == 1)
            return s;
        
        char[] chars = s.toCharArray();
        int len = chars.length;
        
        int maxStart = -1;
        int maxLen = 0;
        for (int i = 0 ; i < len ; i ++)
        {
            // 寻找以i-1,i为中点偶数长度的回文
            int low = i - 1;
            int high = i;
            while (low >= 0 && high < len && chars[low] == chars[high])
            {
                low --;
                high ++;
            }
            low ++;
            high --;
            int curLen = high - low + 1;
            if (curLen > maxLen)
            {
                maxStart = low;
                maxLen = curLen;
            }

            // 寻找以i为中心的奇数长度的回文  
            low = i - 1;
            high = i + 1;
            while (low >= 0 && high < len && chars[low] == chars[high])
            {
                low --;
                high ++;
            }
            low ++;
            high --;
            curLen = high - low + 1;
            if (curLen > maxLen)
            {
                maxStart = low;
                maxLen = curLen;
            }
        }
        
        return s.substring(maxStart, maxStart + maxLen);
    }
 
    ///////////////////////////////////////
    // Solution B: Brute Force
    //
    // O(n ^ 3)   
    public String longestPalindrome_BruteForce(String s) 
    {
        if (s == null || s.length() == 0 || s.length() == 1)
            return s;
        
        char[] chars = s.toCharArray();
        int len = chars.length;
        for (int size = len ; size > 0 ; size --)
        {
            for (int offset = 0 ; offset < len - size + 1 ; offset ++)
            {
                if (isPalin(chars, offset, offset + size - 1))
                {
                    return s.substring(offset, offset + size);
                }
            }
        }
        return null;
    }
    
    // if chars[start] -> chars[end] is palin
    private boolean isPalin(char[] chars, int start, int end)
    {
        for (int i = 0 ; start + i < end - i ; i ++)
        {
            if (chars[start + i] != chars[end - i])
                return false;
        }
        return true;
    }
}


[LeetCode]5 Longest Palindromic Substring