最长回文子串
难度:中等
题目描述:找到字符串中最长的回文子串。
思路:“最……”等问题常见思路之一就是动态规划,回文子串减去头尾也是回文子串,故考虑可以由短到长,每个字符本身就可以认为是回文子串,相邻的两个字符如果相同也是回文子串,接下来依次判断长度为3,4直到字符串本身的长度的子串,若其为回文子串,其首尾字符应相同且其内部子串为回文子串。
优化:若当前得到的最长回文子串的长度+2小于当前寻找子串的长度,不可能有更长的回文子串,可跳出循环。
状态转移方程:P(i, j) = P(i+1, j−1) ∧ (Si == Sj)
源码如下:
public class Main {
public String longestPalindrome(String s) {
if(s == null || s.length() == 0)
return s;
int len = s.length();
boolean[][] isPal = new boolean[len][len];
String maxLengthStr = s.charAt(0) + "";
for(int i = 0; i < len; i++)
{
isPal[i][i] = true;
}
for(int i = 1; i < len; i++)
{
if(s.charAt(i - 1) == s.charAt(i))
{
isPal[i-1][i] = true;
if(maxLengthStr.length() < 2)
{
maxLengthStr = s.substring(i-1, i+1);
}
}
}
for(int i = 2; i < len; i++)
{
if(maxLengthStr.length() + 1 < i)
break;
for(int j = i; j < len; j++)
{
if(isPal[j - i + 1][j - 1] && (s.charAt(j - i) == s.charAt(j)))
{
isPal[j - i][j] = true;
if(maxLengthStr.length() < i + 1)
{
maxLengthStr = s.substring(j - i, j + 1);
}
}
}
}
return maxLengthStr;
}
}