编写一个java程序:输入一个字符串 s,输出s 中最长的回文子字符串。(如果字符串的相反顺序与原始字符串相同,则字符串称为回文)(s的长度介于1到50之间 且 s 仅包含字母和数字)
时间: 2023-06-19 09:07:55 浏览: 109
如何输出字符串的最长回文子串
以下是一个可能的 Java 程序实现。该程序采用了中心扩展算法,时间复杂度为 O(n^2)。
```java
import java.util.Scanner;
public class LongestPalindrome {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
String longestPalindrome = longestPalindrome(s);
System.out.println(longestPalindrome);
}
public static String longestPalindrome(String s) {
if (s == null || s.length() < 1) {
return "";
}
int start = 0, end = 0;
for (int i = 0; i < s.length(); i++) {
int len1 = expandAroundCenter(s, i, i);
int len2 = expandAroundCenter(s, i, i + 1);
int len = Math.max(len1, len2);
if (len > end - start) {
start = i - (len - 1) / 2;
end = i + len / 2;
}
}
return s.substring(start, end + 1);
}
private static int expandAroundCenter(String s, int left, int right) {
while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
left--;
right++;
}
return right - left - 1;
}
}
```
该程序先读入字符串 `s`,然后调用 `longestPalindrome` 方法,返回最长的回文子字符串。该方法首先判断 `s` 是否为空或长度小于 1,如果是,则返回空字符串。
接着,用两个指针分别从字符串的左右两端开始向中间扩展,检查以当前字符为中心的奇数长度回文和以当前字符和下一个字符为中心的偶数长度回文。用 `Math.max` 方法比较两种回文的长度,如果当前回文长度大于之前找到的最长回文长度,更新起始和结束位置。
最后,返回起始和结束位置之间的子字符串,即最长的回文子字符串。
阅读全文