dp解最长回文子串
Posted Pistachiout
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dp解最长回文子串相关的知识,希望对你有一定的参考价值。
解题思路
动态规划
对于一个子串而言,如果它是回文串,并且长度大于 22,那么将它首尾的两个字母去除之后,它仍然是个回文串。例如对于字符串“ababa”,如果我们已经知道 “bab” 是回文串,那么 “ababa” 一定是回文串,这是因为它的首尾两个字母都是“a”。
根据这样的思路,我们就可以用动态规划的方法解决本题。我们用 P(i,j) 表示 s[i:j]是否为回文串:
那么我们就可以写出动态规划的状态转移方程:
P(i, j) = P(i+1, j-1)∧(Si==Sj)
代码
public class Solution
public String longestPalindrome(String s)
int len = s.length();
if (len < 2)
return s;
int maxLen = 1;
int begin = 0;
// dp[i][j] 表示 s[i..j] 是否是回文串
boolean[][] dp = new boolean[len][len];
// 初始化:所有长度为 1 的子串都是回文串
for (int i = 0; i < len; i++)
dp[i][i] = true;
char[] charArray = s.toCharArray();
// 递推开始
// 先枚举子串长度
for (int L = 2; L <= len; L++)
// 枚举左边界,左边界的上限设置可以宽松一些
for (int i = 0; i < len; i++)
// 由 L 和 i 可以确定右边界,即 j - i + 1 = L 得
int j = L + i - 1;
// 如果右边界越界,就可以退出当前循环
if (j >= len)
break;
if (charArray[i] != charArray[j])
dp[i][j] = false;
else
if (j - i < 3)
dp[i][j] = true;
else
dp[i][j] = dp[i + 1][j - 1];
// 只要 dp[i][L] == true 成立,就表示子串 s[i..L] 是回文,此时记录回文长度和起始位置
if (dp[i][j] && j - i + 1 > maxLen)
maxLen = j - i + 1;
begin = i;
return s.substring(begin, begin + maxLen);
以上是关于dp解最长回文子串的主要内容,如果未能解决你的问题,请参考以下文章