Skip to content

Commit cdd58de

Browse files
Create 5. 最长回文子串.md
1 parent ba7d77e commit cdd58de

File tree

1 file changed

+63
-0
lines changed

1 file changed

+63
-0
lines changed

Enumerate/5. 最长回文子串.md

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
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+
```

0 commit comments

Comments
 (0)