题目:
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
解析:
代码:
import java.util.*;
public class code5 {
public static String longestPalindrome(String s) {
if (s == null || s.length() < 1) {
return "";
}
int start = 0; // 记录回文子串起始位置
int end = 0; // 记录回文子串终止位置
int center = 0;
for (int i = 0; i < s.length(); i++) {
int len1 = expandAroundCenter(s, i, i); // 一个元素为中心,即最长回文串长度为奇数
int len2 = expandAroundCenter(s, i, i + 1); // 两个元素为中心,即最长回文串长度为偶数
int maxlen = Math.max(len1, len2); // 记录最大回文子串的长度
if (maxlen > end - start) {
center = i; // 以center为中心
start = center - (maxlen - 1) / 2; // 中心左边的长度
end = center + maxlen / 2; // 中心右边的长度
}
}
// 如果我们的回文串的长度为偶数,那么中心左边的长度会比右边的长度小1
// public substring(int beginIndex, int endIndex)的取值范围: [beginIndex, endIndex),
// 所以要end+1
return s.substring(start, end + 1);
}
// 计算以left和right为中心,同时向左向右扩展后能够得到的最长回文串长度
public static int expandAroundCenter(String s, int left, int right) {
int L = left;
int R = right;
while (L >= 0 && R < s.length() && s.charAt(L) == s.charAt(R)) {
L--;
R++;
}
return R - L - 1;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = new String();
while (sc.hasNextLine()) {
str = sc.nextLine();
String s = longestPalindrome(str);
System.out.println(s);
}
}
}