1,问题描述
5. 最长回文子串
难度:中等
给你一个字符串 s
,找到 s
中最长的 回文 子串。
示例 1:
1 2 3
| 输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。
|
示例 2:
提示:
1 <= s.length <= 1000
s
仅由数字和英文字母组成
2,初步思考
中心扩展,中心节点&中心双边界分别向左右扩展蔓延,校验检查
3,代码处理
我的题解代码(扩展法)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| public String longestPalindrome(String s) { String res = s.substring(0, 1); for (int i = 0; i < s.length(); i++) { for (int j = 1; j <= i && j < s.length() - i; j++) { if (s.charAt(i + j) == s.charAt(i - j)) { if (j * 2 + 1 > res.length()) { res = s.substring(i - j, i + j + 1); } } else { break; } }
for (int j = 0; j <= i && j < s.length() - i - 1; j++) { if (s.charAt(i + j + 1) == s.charAt(i - j)) { if (j * 2 + 2 > res.length()) { res = s.substring(i - j, i + j + 2); } } else { break; } } } return res; }
|
官方的题解代码(动态规划)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| public String longestPalindrome_dynamic(String s) { if (s.length() < 2) { return s; } String res = s.substring(0, 1); int len = s.length(); boolean[][] dp = new boolean[len][len]; for (int i = 0; i < len; i++) { dp[i][i] = true; }
for (int r = 0; r < len; r++) { for (int l = 0; l < r; l++) { boolean flag = s.charAt(l) == s.charAt(r); if (r - l <= 2) { dp[l][r] = flag; } else { dp[l][r] = flag && dp[l + 1][r - 1]; } if (dp[l][r] && r - l + 1 > res.length()) { res = s.substring(l, r + 1); } } } return res; }
|
4,思考
动态规划的解法感觉更好一些,其中最重要的是要找出动态方程式