给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd”
输出: “bb”
Java实现:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
//动态规划算法
class Solution {
public String longestPalindrome(String s) {
int len = s.length();
// 特判
if (len < 2){
return s;
}
int maxLen = 1;
int begin = 0;
// 1. 状态定义
// dp[i][j] 表示s[i...j] 是否是回文串
// 2. 初始化
boolean[][] dp = new boolean[len][len];
for (int i = 0; i < len; i++) {
dp[i][i] = true;
}
char[] chars = s.toCharArray();
// 3. 状态转移
// 注意:先填左下角
// 填表规则:先一列一列的填写,再一行一行的填,保证左下方的单元格先进行计算
for (int j = 1;j < len;j++){
for (int i = 0; i < j; i++) {
// 头尾字符不相等,不是回文串
if (chars[i] != chars[j]){
dp[i][j] = false;
}else {
// 相等的情况下
// 考虑头尾去掉以后没有字符剩余,或者剩下一个字符的时候,肯定是回文串
if (j - i < 3){
dp[i][j] = true;
}else {
// 状态转移
dp[i][j] = dp[i + 1][j - 1];
}
}
// 只要dp[i][j] == true 成立,表示s[i...j] 是否是回文串
// 此时更新记录回文长度和起始位置
if (dp[i][j] && j - i + 1 > maxLen){
maxLen = j - i + 1;
begin = i;
}
}
}
// 4. 返回值
return s.substring(begin,begin + maxLen);
}
}
//
暴力解法
//class Solution {
// //暴力解法
// public String longestPalindrome(String s) {
// int n=s.length();
// if(n<2){
// return s;
// }
// int maxLen=1;
// int begin=0;
//
// char [] chararray=s.toCharArray();
// for(int i=0;i<n-1;i++){
// for(int j=i+1;j<n;j++){
// if(j-i+1>maxLen&&validPlindromic(chararray,i,j)){
// maxLen=j-i+1;
// begin=i;
// }
//
// }
//
// }
// return s.substring(begin,begin+maxLen);
//
// }
// private boolean validPlindromic(char [] cha,int left,int right){
// while(left<right){
// if(cha[left]!=cha[right]){
// return false;
//
// }
// left++;
// right--;
// }
// return true;
//
// }
//}
中心扩展算法
//class Solution {
// public 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 int expandAroundCenter(String s, int left, int right) {
// int L = left, R = right;
// while (L >= 0 && R < s.length() && s.charAt(L) == s.charAt(R)) {
// L--;
// R++;
// }
// return R - L - 1;
// }
//}
//
//
//
public class MainClass {
public static String stringToString(String input) {
if (input == null) {
return "null";
}
return Json.value(input).toString();
}
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String line;
while ((line = in.readLine()) != null) {
String s = stringToString(line);
String ret = new Solution().longestPalindrome(s);
String out = (ret);
System.out.print(out);
}
}
}