问题:
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。
测试用例:
示例 1:
输入: "babad"
输出: "bab"
注意: "aba"也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
官网给出了复杂度为n的解答,点击这里
使用动态规划的方法,复杂度为n²,代码如下:
package com.lmm.LeedCode;
import java.util.Scanner;
/**
* @author lmm E-mail:violet_mmhh@163.com
* @version 时间:2018年10月23日
*/
public class Solution0005 {
public static String longestPalindrome(String s) {
int n = s.length();
if (n > 1000) {
return "";
}
int maxLen = 0;
String longestStr = null;
if (n == 0)
return "";
int p[][] = new int[n][n];// p[i][j]=1表示s的i到j字串为回文字串;
for (int i = 0; i < n; i++) {
p[i][i] = 1;
}
longestStr = s.substring(0, 1);
for (int i = 0; i < n - 1; i++) {
if (s.charAt(i) == s.charAt(i + 1)) {
p[i][i + 1] = 1;
longestStr = s.substring(i, i + 2);
}
}
for (int l = 3; l <= n; l++) {
for (int i = 0; i < n && i + l - 1 < n; i++) {
int j = i + l - 1;
if (s.charAt(i) == s.charAt(j)) {
p[i][j] = p[i + 1][j - 1];
if (p[i][j] == 1 && l > maxLen)
longestStr = s.substring(i, j + 1);
else
p[i][j] = 0;
}
}
}
return longestStr;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.next();
System.out.println(longestPalindrome(s));
}
}
运行结果: