Skip to content

Commit 22c2071

Browse files
committed
feat: add solutions to lc problem: No.0005
No.0005.Longest Palindromic Substring fix doocs#848
1 parent 4e70ae5 commit 22c2071

File tree

2 files changed

+219
-1
lines changed

2 files changed

+219
-1
lines changed

solution/0000-0099/0005.Longest Palindromic Substring/README.md

Lines changed: 113 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,13 @@
4545
- 当 $j - i \lt 2$,即字符串长度为 `2` 时,只要 $s[i] == s[j]$,那么 $dp[i][j]$ 就为 `true`
4646
- 当 $j - i \ge 2$,有 $dp[i][j] = dp[i + 1][j - 1] \cap s[i] == s[j]$。
4747

48-
时间复杂度 $O(n^2)$,空间复杂度 $O(n^2)$。
48+
时间复杂度 $O(n^2)$,空间复杂度 $O(n^2)$。其中 $n$ 是字符串 $s$ 的长度。
49+
50+
**方法二:枚举回文中间点**
51+
52+
我们可以枚举回文中间点,向两边扩散,找到最长的回文串。
53+
54+
时间复杂度 $O(n^2)$,空间复杂度 $O(1)$。其中 $n$ 是字符串 $s$ 的长度。
4955

5056
<!-- tabs:start -->
5157

@@ -70,6 +76,26 @@ class Solution:
7076
return s[start : start + mx]
7177
```
7278

79+
```python
80+
class Solution:
81+
def longestPalindrome(self, s: str) -> str:
82+
def f(l, r):
83+
while l >= 0 and r < n and s[l] == s[r]:
84+
l, r = l - 1, r + 1
85+
return r - l - 1
86+
87+
n = len(s)
88+
start, mx = 0, 1
89+
for i in range(n):
90+
a = f(i, i)
91+
b = f(i, i + 1)
92+
t = max(a, b)
93+
if mx < t:
94+
mx = t
95+
start = i - ((t - 1) >> 1)
96+
return s[start: start + mx]
97+
```
98+
7399
### **Java**
74100

75101
<!-- 这里可写当前语言的特殊实现逻辑 -->
@@ -98,6 +124,37 @@ class Solution {
98124
}
99125
```
100126

127+
```java
128+
class Solution {
129+
private String s;
130+
private int n;
131+
132+
public String longestPalindrome(String s) {
133+
this.s = s;
134+
n = s.length();
135+
int start = 0, mx = 1;
136+
for (int i = 0; i < n; ++i) {
137+
int a = f(i, i);
138+
int b = f(i, i + 1);
139+
int t = Math.max(a, b);
140+
if (mx < t) {
141+
mx = t;
142+
start = i - ((t - 1) >> 1);
143+
}
144+
}
145+
return s.substring(start, start + mx);
146+
}
147+
148+
private int f(int l, int r) {
149+
while (l >= 0 && r < n && s.charAt(l) == s.charAt(r)) {
150+
--l;
151+
++r;
152+
}
153+
return r - l - 1;
154+
}
155+
}
156+
```
157+
101158
### **C++**
102159

103160
```cpp
@@ -125,6 +182,32 @@ public:
125182
};
126183
```
127184
185+
```cpp
186+
class Solution {
187+
public:
188+
string longestPalindrome(string s) {
189+
int n = s.size();
190+
int start = 0, mx = 1;
191+
auto f = [&](int l, int r) {
192+
while (l >= 0 && r < n && s[l] == s[r]) {
193+
l--, r++;
194+
}
195+
return r - l - 1;
196+
};
197+
for (int i = 0; i < n; ++i) {
198+
int a = f(i, i);
199+
int b = f(i, i + 1);
200+
int t = max(a, b);
201+
if (mx < t) {
202+
mx = t;
203+
start = i - (t - 1 >> 1);
204+
}
205+
}
206+
return s.substr(start, mx);
207+
}
208+
};
209+
```
210+
128211
### **Go**
129212

130213
```go
@@ -151,6 +234,35 @@ func longestPalindrome(s string) string {
151234
}
152235
```
153236

237+
```go
238+
func longestPalindrome(s string) string {
239+
n := len(s)
240+
start, mx := 0, 1
241+
f := func(l, r int) int {
242+
for l >= 0 && r < n && s[l] == s[r] {
243+
l, r = l-1, r+1
244+
}
245+
return r - l - 1
246+
}
247+
for i := range s {
248+
a, b := f(i, i), f(i, i+1)
249+
t := max(a, b)
250+
if mx < t {
251+
mx = t
252+
start = i - ((t - 1) >> 1)
253+
}
254+
}
255+
return s[start : start+mx]
256+
}
257+
258+
func max(a, b int) int {
259+
if a > b {
260+
return a
261+
}
262+
return b
263+
}
264+
```
265+
154266
### **C#**
155267

156268
```cs

solution/0000-0099/0005.Longest Palindromic Substring/README_EN.md

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,26 @@ class Solution:
5555
return s[start : start + mx]
5656
```
5757

58+
```python
59+
class Solution:
60+
def longestPalindrome(self, s: str) -> str:
61+
def f(l, r):
62+
while l >= 0 and r < n and s[l] == s[r]:
63+
l, r = l - 1, r + 1
64+
return r - l - 1
65+
66+
n = len(s)
67+
start, mx = 0, 1
68+
for i in range(n):
69+
a = f(i, i)
70+
b = f(i, i + 1)
71+
t = max(a, b)
72+
if mx < t:
73+
mx = t
74+
start = i - ((t - 1) >> 1)
75+
return s[start: start + mx]
76+
```
77+
5878
### **Java**
5979

6080
```java
@@ -81,6 +101,37 @@ class Solution {
81101
}
82102
```
83103

104+
```java
105+
class Solution {
106+
private String s;
107+
private int n;
108+
109+
public String longestPalindrome(String s) {
110+
this.s = s;
111+
n = s.length();
112+
int start = 0, mx = 1;
113+
for (int i = 0; i < n; ++i) {
114+
int a = f(i, i);
115+
int b = f(i, i + 1);
116+
int t = Math.max(a, b);
117+
if (mx < t) {
118+
mx = t;
119+
start = i - ((t - 1) >> 1);
120+
}
121+
}
122+
return s.substring(start, start + mx);
123+
}
124+
125+
private int f(int l, int r) {
126+
while (l >= 0 && r < n && s.charAt(l) == s.charAt(r)) {
127+
--l;
128+
++r;
129+
}
130+
return r - l - 1;
131+
}
132+
}
133+
```
134+
84135
### **C++**
85136

86137
```cpp
@@ -108,6 +159,32 @@ public:
108159
};
109160
```
110161
162+
```cpp
163+
class Solution {
164+
public:
165+
string longestPalindrome(string s) {
166+
int n = s.size();
167+
int start = 0, mx = 1;
168+
auto f = [&](int l, int r) {
169+
while (l >= 0 && r < n && s[l] == s[r]) {
170+
l--, r++;
171+
}
172+
return r - l - 1;
173+
};
174+
for (int i = 0; i < n; ++i) {
175+
int a = f(i, i);
176+
int b = f(i, i + 1);
177+
int t = max(a, b);
178+
if (mx < t) {
179+
mx = t;
180+
start = i - (t - 1 >> 1);
181+
}
182+
}
183+
return s.substr(start, mx);
184+
}
185+
};
186+
```
187+
111188
### **Go**
112189

113190
```go
@@ -134,6 +211,35 @@ func longestPalindrome(s string) string {
134211
}
135212
```
136213

214+
```go
215+
func longestPalindrome(s string) string {
216+
n := len(s)
217+
start, mx := 0, 1
218+
f := func(l, r int) int {
219+
for l >= 0 && r < n && s[l] == s[r] {
220+
l, r = l-1, r+1
221+
}
222+
return r - l - 1
223+
}
224+
for i := range s {
225+
a, b := f(i, i), f(i, i+1)
226+
t := max(a, b)
227+
if mx < t {
228+
mx = t
229+
start = i - ((t - 1) >> 1)
230+
}
231+
}
232+
return s[start : start+mx]
233+
}
234+
235+
func max(a, b int) int {
236+
if a > b {
237+
return a
238+
}
239+
return b
240+
}
241+
```
242+
137243
### **C#**
138244

139245
```cs

0 commit comments

Comments
 (0)