字符串的最长回文子串算法是指在一个字符串中,找出一个最长的回文子串。它是一种动态规划算法,通过填表的方式来解决问题。
例题:假设有一个字符串s,请问它的最长回文子串是多少?
分析:我们可以使用动态规划算法来解决这个问题。首先定义一个二维数组dp,其中dp[i][j]表示s[i…j]是否是回文串。当s[i] == s[j]时,如果s[i + 1…j – 1]是回文串,则s[i…j]也是回文串;否则s[i…j]不是回文串。当s[i] != s[j]时,s[i…j]不是回文串。因此,如果我们已经知道了所有更短的子串的回文性质,那么就可以从短到长依次判断所有子串的回文性质,最终得到最长的回文子串。
Java代码实现:
public static String longestPalindrome(String s) {
int n = s.length();
boolean[][] dp = new boolean[n][n];
String res = "";
for (int len = 1; len <= n; len++) {
for (int i = 0; i + len - 1 < n; i++) {
int j = i + len - 1;
dp[i][j] = s.charAt(i) == s.charAt(j) && (len <= 2 || dp[i + 1][j - 1]);
if (dp[i][j] && len > res.length()) {
res = s.substring(i, j + 1);
}
}
}
return res;
}
代码分析:
- 首先定义一个二维数组dp,其中dp[i][j]表示s[i…j]是否是回文串。
- 初始化res为空串。
- 从len = 1开始遍历所有子串的长度,对于每个子串,从i = 0开始遍历所有可能的起始位置i,计算终止位置j = i + len – 1,然后判断该子串是否是回文串。
- 如果该子串是回文串,且长度大于res的长度,则更新res为该子串。
- 最终返回res。