题目:
求字符串的最大会问子串;
Given a string
s
, return the longest palindromic substring ins
.给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。 示例 2:
输入: "cbbd" 输出: "bb"
解题分析:
这个题好多方法;
有最基础的"从当前往两边扩散"、动态规划、Manacher;
这里介绍往两边扩散方法:
class Solution {
private int start, maxLen;
public String longestPalindrome(String s) {
// 如果字符串的长度小于2,直接返回
if(s.length() < 2){
return s;
}
// 对除最后一个元素外其他元素进行遍历
for(int index = 0; index < s.length() - 1; index ++){
// 奇数
extendPalindrome(s, index, index);
// 偶数
extendPalindrome(s, index, index + 1);
}
return s.substring(start, start + maxLen);
}
public void extendPalindrome(String s, int left, int right){
while(left >=0 && right < s.length() && s.charAt(left) == s.charAt(right)){
// 向两边扩散
left --;
right ++;
}
if(maxLen < right - left - 1){
start = left + 1;
maxLen = right - left - 1;
}
}
}
运行结果:
动态规划方法:
class Solution {
public String longestPalindrome(String s) {
if (s == null || s.length() < 2) return s;
boolean[][] dp = new boolean[s.length()][s.length()];
int row = 0, col = 0;
for (int i = s.length() - 2; i >= 0; i--) {
for (int j = i + 1; j <= s.length() - 1; j++) {
if (s.charAt(i) == s.charAt(j) && (j - i <= 2 || dp[i + 1][j - 1])) {
dp[i][j] = true;
if (j - i + 1 > col - row + 1) {
row = i;
col = j;
}
}
}
}
return s.substring(row, col + 1);
}
}
运行结果:效率比不上往两边扩散法: