1、题目
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。
示例 1:
输入: “babad”
输出: “bab”
注意: "aba"也是一个有效答案。
示例 2:
输入: “cbbd”
输出: “bb”
2、解法:
@1动态规划法:
-
思路:子串本身正着读、反着读都一样,比如“aba”,而“abcfgcba”,虽然abc相同,但是它们不是同一子串。
例如“abaaba”,只要aa内部对称,外部ab、ba也对称,那么整个都是回文子串。 -
从确定1子串

2子串

3子串…n子串(这种方法不适用2子串,是因为[i+1,j-1]的范围)

class Solution {
public String longestPalindrome(String s) {
// 如果是空子串
if (s.equals("")) {
return "";
}
int start = 0, longest = 1;
// 创建2维数组,用来记录
int len = s.length();
int[][] arr = new int[len][len];
char[] sr = s.toCharArray();
for (int i = 0; i < len; i++){
// 1子串
arr[i][i] = 1;
if (i < len-1) {
if (sr[i] == sr[i+1]) {
// 2子串
arr[i][i+1] = 1;
start = i;
longest = 2;
}
}
}
// 3子串...length子串
for (int n = 3; n <= len; n++) {
for (int i = 0; (i+n-1) < len; i++) {
if (sr[i] == sr[i+n-1] && arr[i+1][i+n-2] == 1) {
arr[i][i+n-1] = 1;
start = i;
longest = n;
}
}
}
return s.substring(start, start + longest);
}
}
时间复杂度O(n^2) ,空间复杂度O(n^2)
809

被折叠的 条评论
为什么被折叠?



