题目
给定一个字符串 s,在 s 中找到最长的回文子串,s 的最大长度是 1000。
题目难度:中等
描述
Medium
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"
题解
找字符串中最小回文子串,2 种方法。
一、动态规划(DP)
定义一个数组 dp,d[i][j]
是回文的前提:
- 第 i 个字符和第 j 个字符相等
- j-i <= 2 (判断边界:当 i== j时,如 “cbbd” 中,i = 1, j=1, 那么单纯判断
d[i+1][j-1]= d[2][3]
是不符合要求的,所以如何 j-i > 2,则该 i 到 j的子串直接就可以判断不是回文),在 j-i <= 2时候,才可以判断d[i+1][j-1]
是否是回文
Java
// dp time: O(n^2) space: O(n^2)
public static String longestPalindromeDP(String s) {
if(s == null || s.length() == 0) return s;
String res = "";
int max = 0;
boolean[][] dp = new boolean[s.length()][s.length()];
for(int j=0; j<s.length(); j++){
for(int i=0; i<=j; i++){
dp[i][j] = s.charAt(i) == s.charAt(j) && ((j-i <= 2) || dp[i+1][j-1]);
if(dp[i][j]){
if(j-i+1 > max){
max = j-i+1;
res = s.substring(i, j+1);
}
}
}
}
return res;
}
Python
def LongestPalindromicSubstring_DP(s):
if not s or len(s) == 0:
return s
max = 0
res = ''
dp = [[False for x in range(len(s))] for j in range(len(s))]
for j in range(len(s)):
for i in range(0, j + 1):
dp[i][j] = s[i] == s[j] and ((j - i <= 2) or dp[i + 1][j - 1])
if dp[i][j]:
if j - i + 1 > max:
max = j - i + 1
res = s[i: j + 1]
return res
二、中心扩散
如字符串 “baab”,先以 b 为中心,往前后扩散 1 个,2 个值为起点,如果是回文,再向后扩散
Java
static String res = "";
public static String longestPalindromeCenterSpread(String s) {
if(s == null || s.length() == 0) return s;
for(int j=0; j<s.length(); j++){
helper(s, j, j);
helper(s, j, j+1);
}
return res;
}
public static void helper(String s, int left, int right){
while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)){
left--;
right++;
}
String cur = s.substring(left+1, right);
// System.out.println(cur);
if(cur.length() > res.length()){
res = cur;
}
}
// 运行结果
a
b
abba
b
a
abba
Python
res = ''
def helper(s, l, r):
while l >= 0 and r < len(s) and s[l] == s[r]:
l -= 1
r += 1
global res
cur = s[l + 1:r]
if len(res) < len(cur):
res = cur
def LongestPalindromicSubstring(s):
if not s or len(s) == 0:
return s
global res
for i in range(len(s)):
helper(s, i, i)
helper(s, i, i + 1)
return res