给定一个非空字符串s,您需要找到s中最长的回文子串。回文串是指正着读和倒着读都一样的字符串。您可以假设s的最大长度为1000。 实现函数longestPalindrome(String s),返回s中最长的回文子串。
时间: 2024-02-05 07:13:54 浏览: 64
我们可以使用动态规划来解决这个问题。我们首先定义一个布尔型的二维数组dp,其中dp[i][j]表示字符串s在区间[i, j]之间的子串是否是回文串。那么如果dp[i][j]=true,则表示s[i]到s[j]是一个回文串。
接下来考虑状态转移方程。当s[i]==s[j]时,如果dp[i+1][j-1]=true,则说明s[i]到s[j]也是一个回文串,因此dp[i][j]=true。否则如果dp[i+1][j-1]=false,则说明s[i]到s[j]不是回文串,因此dp[i][j]=false。
当s[i]!=s[j]时,dp[i][j]=false。
回文串的长度可能是奇数或偶数,因此我们需要枚举子串长度。对于每个长度l,我们枚举左端点i,右端点j=l+i-1,然后根据上述状态转移方程来更新dp[i][j]。最后在dp数组中找到值为true且长度最大的子串即可。
以下是Java代码实现:
```
public 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;
if (len == 1) {
dp[i][j] = true;
} else if (len == 2) {
dp[i][j] = (s.charAt(i) == s.charAt(j));
} else {
dp[i][j] = (s.charAt(i) == s.charAt(j) && dp[i + 1][j - 1]);
}
if (dp[i][j] && len > res.length()) {
res = s.substring(i, j + 1);
}
}
}
return res;
}
```
阅读全文