使用Java,给你一个字符串s,找到s中最长的回文子串。提示:1<=s.length<=1000。s仅由数字和英文字母组成。请在编码结束后把结果打印出来。
时间: 2024-12-25 20:24:20 浏览: 4
在Java中,寻找一个字符串中最长的回文子串可以使用动态规划(Dynamic Programming)的方法来解决。这里我们可以创建一个二维布尔数组`dp`,其中`dp[i][j]`表示从索引i到j的子串是否是回文。以下是算法的主要步骤:
1. 初始化:设置边界情况,如果字符串长度小于等于1,直接返回整个字符串;长度为2时,只需检查两个字符是否相等。
2. 状态转移:遍历字符串,对于每个长度大于1的子串,首先检查其首尾字符是否相等,如果相等,则递归地检查去掉首尾字符后的子串是否也是回文(即`dp[i+1][j-1]`),如果成立则`dp[i][j] = true`。
3. 更新最长回文子串:在状态转移的过程中,记录下最长回文子串的起始位置和结束位置。当发现新的回文子串时,更新这两个值。
4. 返回结果:最后,从最长回文子串的起始和结束位置提取出子串并打印出来。
下面是一个简单的Java函数实现:
```java
public class Solution {
public String longestPalindrome(String s) {
int n = s.length();
boolean[][] dp = new boolean[n][n];
int start = 0;
for (int i = 0; i < n; ++i) {
dp[i][i] = true;
if (i < n - 1 && (Character.isLetterOrDigit(s.charAt(i)) == Character.isLetterOrDigit(s.charAt(i + 1)) && s.charAt(i) == s.charAt(i + 1))) {
dp[i][i + 1] = true;
start = i;
}
}
for (int length = 3; length <= n; ++length) {
for (int i = 0; i + length - 1 < n; ++i) {
int j = i + length - 1;
if (Character.isLetterOrDigit(s.charAt(i)) == Character.isLetterOrDigit(s.charAt(j))
&& s.charAt(i) == s.charAt(j)) {
dp[i][j] = dp[i + 1][j - 1];
if (dp[i][j]) {
start = i;
// 更新最长回文子串长度
}
}
}
}
return s.substring(start, start + dp[start].length());
}
public static void main(String[] args) {
Solution sol = new Solution();
System.out.println(sol.longestPalindrome("babad")); // 输出 "bab"
}
}
```
阅读全文