File tree 1 file changed +63
-0
lines changed
1 file changed +63
-0
lines changed Original file line number Diff line number Diff line change
1
+ #### 5. 最长回文子串
2
+
3
+ 难度:中等
4
+
5
+ ---
6
+
7
+ 给你一个字符串 ` s ` ,找到 ` s ` 中最长的回文子串。
8
+
9
+ 如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
10
+
11
+ ** 示例 1:**
12
+
13
+ ```
14
+ 输入:s = "babad"
15
+ 输出:"bab"
16
+ 解释:"aba" 同样是符合题意的答案。
17
+ ```
18
+
19
+ ** 示例 2:**
20
+
21
+ ```
22
+ 输入:s = "cbbd"
23
+ 输出:"bb"
24
+ ```
25
+
26
+ ** 提示:**
27
+
28
+ * ` 1 <= s.length <= 1000 `
29
+ * ` s ` 仅由数字和英文字母组成
30
+
31
+ ---
32
+
33
+ 二维动态规划:
34
+
35
+ ` dp[i][j] ` 表示从下标 ` i ` 到下标 ` j ` 范围内的字符串是否是回文。状态转移方程为 $dp[ i] [ j ] = (dp[ i + 1] [ j - 1 ] ~ \& ~ s[ i] == s[ j] ) ~ \| ~ j - i == 1$,初始化 ` dp[i][i] = true ` 。所以外循环是从 ` j ` 开始,内循环是 ` i ` 。
36
+
37
+ ``` Java
38
+ class Solution {
39
+ public String longestPalindrome (String s ) {
40
+ int n = s. length(), index = 0 , maxn = 1 ;
41
+ boolean [][] dp = new boolean [n][n];
42
+ for (int i = 0 ; i < n; i++ ){
43
+ dp[i][i] = true ;
44
+ }
45
+ for (int j = 1 ; j < n; j++ ){
46
+ for (int i = 0 ; i < j; i++ ){
47
+ if (s. charAt(i) != s. charAt(j)){
48
+ dp[i][j] = false ;
49
+ } else if (j - i == 1 ){
50
+ dp[i][j] = true ;
51
+ } else {
52
+ dp[i][j] = dp[i + 1 ][j - 1 ];
53
+ }
54
+ if (dp[i][j] && j - i + 1 > maxn){
55
+ maxn = j - i + 1 ;
56
+ index = i;
57
+ }
58
+ }
59
+ }
60
+ return s. substring(index, index + maxn);
61
+ }
62
+ }
63
+ ```
You can’t perform that action at this time.
0 commit comments