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:

Input:
 "babad"


Output:
 "bab"


Note:
 "aba" is also a valid answer.

Example:

Input:
 "cbbd"


Output:
 "bb"

Solution

(1) Java

Expand around the center, it is O(n^2)

class Solution {
    public String longestPalindrome(String s) {
        if (s == null || s.length() == 0) {
            return s;
        }
        int[] range = new int[2];
        for (int i = 0; i < s.length(); i++) {
            findPalindrome(s, i, i, range);
            findPalindrome(s, i, i+1, range);
        }
        return s.substring(range[0], range[1]+1);
    }

    private void findPalindrome(String s, int i, int j, int[] range) {
        while (i >= 0 && j < s.length()) {
           if (s.charAt(i) == s.charAt(j)) {
               if (j-i > range[1]-range[0]) {
                   range[0] = i;
                   range[1] = j;
               }
               i--;
               j++;
           } else {
               return;
           }
        }        
    }
}

(2) Python

DP passed

class Solution(object):
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        if not s:
            return s
        length = len(s)
        dp = [[False for j in range(length)] for i in range(length)]
        (start,end) = (0,0)
        for l in range(1, length+1):
            for i in range(length-l+1):
                j = i+l-1
                if s[i] == s[j] and (j-i<=2 or dp[i+1][j-1]):
                    dp[i][j] = True
                    if j-i>end-start:
                        (start,end) = (i,j)
        return s[start:end+1]

(3) Scala

Although ugly, still works

object Solution {
    def longestPalindrome(s: String): String = {
        val input: Option[String] = Some(s)
        input match {
            case None => null
            case _ => helper(s, 0)
        }
    }

    def helper(s: String, idx: Int): String = {
        if (idx == s.length()) {
            return ""
        }
        val s1 = getPalindrome(s, idx, idx)
        val s2 = getPalindrome(s, idx, idx+1)
        val s3 = s1.length()-s2.length() match {
            case x if x >= 0 => s1
            case y if y < 0 => s2
        }
        val s4 = helper(s, idx+1)
        val s5 = s3.length()-s4.length() match {
            case x if x >= 0 => s3
            case y if y < 0 => s4
        }
        return s5
    }

    def getPalindrome(s: String, idx: Int, nextIdx: Int): String = {
        var left = idx
        var right = nextIdx
        while (left >= 0 && right < s.length()) {
            if (s.charAt(left) == s.charAt(right)) {
                left -= 1
                right += 1
            } else {
                return s.substring(left+1, right)
            }
        }
        return s.substring(left+1, right)
    }
}

results matching ""

    No results matching ""