Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit ee4e016

Browse files
feat: add solutions to lc problems: No.3503,3504 (doocs#4313)
* No.3503.Longest Palindrome After Substring Concatenation I * No.3504.Longest Palindrome After Substring Concatenation II
1 parent 291a680 commit ee4e016

File tree

14 files changed

+1192
-12
lines changed

14 files changed

+1192
-12
lines changed

‎solution/3500-3599/3503.Longest Palindrome After Substring Concatenation I/README.md‎

Lines changed: 200 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,25 +96,222 @@ edit_url: https://github.com/doocs/leetcode/edit/main/solution/3500-3599/3503.Lo
9696
#### Python3
9797

9898
```python
99-
99+
class Solution:
100+
def longestPalindrome(self, s: str, t: str) -> int:
101+
def expand(s: str, g: List[int], l: int, r: int):
102+
while l >= 0 and r < len(s) and s[l] == s[r]:
103+
g[l] = max(g[l], r - l + 1)
104+
l, r = l - 1, r + 1
105+
106+
def calc(s: str) -> List[int]:
107+
n = len(s)
108+
g = [0] * n
109+
for i in range(n):
110+
expand(s, g, i, i)
111+
expand(s, g, i, i + 1)
112+
return g
113+
114+
m, n = len(s), len(t)
115+
t = t[::-1]
116+
g1, g2 = calc(s), calc(t)
117+
ans = max(*g1, *g2)
118+
f = [[0] * (n + 1) for _ in range(m + 1)]
119+
for i, a in enumerate(s, 1):
120+
for j, b in enumerate(t, 1):
121+
if a == b:
122+
f[i][j] = f[i - 1][j - 1] + 1
123+
ans = max(ans, f[i][j] * 2 + (0 if i >= m else g1[i]))
124+
ans = max(ans, f[i][j] * 2 + (0 if j >= n else g2[j]))
125+
return ans
100126
```
101127

102128
#### Java
103129

104130
```java
105-
131+
class Solution {
132+
public int longestPalindrome(String S, String T) {
133+
char[] s = S.toCharArray();
134+
char[] t = new StringBuilder(T).reverse().toString().toCharArray();
135+
int m = s.length, n = t.length;
136+
int[] g1 = calc(s), g2 = calc(t);
137+
int ans = Math.max(Arrays.stream(g1).max().getAsInt(), Arrays.stream(g2).max().getAsInt());
138+
int[][] f = new int[m + 1][n + 1];
139+
for (int i = 1; i <= m; ++i) {
140+
for (int j = 1; j <= n; ++j) {
141+
if (s[i - 1] == t[j - 1]) {
142+
f[i][j] = f[i - 1][j - 1] + 1;
143+
ans = Math.max(ans, f[i][j] * 2 + (i < m ? g1[i] : 0));
144+
ans = Math.max(ans, f[i][j] * 2 + (j < n ? g2[j] : 0));
145+
}
146+
}
147+
}
148+
return ans;
149+
}
150+
151+
private void expand(char[] s, int[] g, int l, int r) {
152+
while (l >= 0 && r < s.length && s[l] == s[r]) {
153+
g[l] = Math.max(g[l], r - l + 1);
154+
--l;
155+
++r;
156+
}
157+
}
158+
159+
private int[] calc(char[] s) {
160+
int n = s.length;
161+
int[] g = new int[n];
162+
for (int i = 0; i < n; ++i) {
163+
expand(s, g, i, i);
164+
expand(s, g, i, i + 1);
165+
}
166+
return g;
167+
}
168+
}
106169
```
107170

108171
#### C++
109172

110173
```cpp
111-
174+
class Solution {
175+
public:
176+
int longestPalindrome(string s, string t) {
177+
int m = s.size(), n = t.size();
178+
ranges::reverse(t);
179+
vector<int> g1 = calc(s), g2 = calc(t);
180+
int ans = max(ranges::max(g1), ranges::max(g2));
181+
vector<vector<int>> f(m + 1, vector<int>(n + 1));
182+
for (int i = 1; i <= m; ++i) {
183+
for (int j = 1; j <= n; ++j) {
184+
if (s[i - 1] == t[j - 1]) {
185+
f[i][j] = f[i - 1][j - 1] + 1;
186+
ans = max(ans, f[i][j] * 2 + (i < m ? g1[i] : 0));
187+
ans = max(ans, f[i][j] * 2 + (j < n ? g2[j] : 0));
188+
}
189+
}
190+
}
191+
return ans;
192+
}
193+
194+
private:
195+
void expand(const string& s, vector<int>& g, int l, int r) {
196+
while (l >= 0 && r < s.size() && s[l] == s[r]) {
197+
g[l] = max(g[l], r - l + 1);
198+
--l;
199+
++r;
200+
}
201+
}
202+
203+
vector<int> calc(const string& s) {
204+
int n = s.size();
205+
vector<int> g(n, 0);
206+
for (int i = 0; i < n; ++i) {
207+
expand(s, g, i, i);
208+
expand(s, g, i, i + 1);
209+
}
210+
return g;
211+
}
212+
};
112213
```
113214

114215
#### Go
115216

116217
```go
218+
func longestPalindrome(s, t string) int {
219+
m, n := len(s), len(t)
220+
t = reverse(t)
221+
222+
g1, g2 := calc(s), calc(t)
223+
ans := max(slices.Max(g1), slices.Max(g2))
224+
225+
f := make([][]int, m+1)
226+
for i := range f {
227+
f[i] = make([]int, n+1)
228+
}
229+
230+
for i := 1; i <= m; i++ {
231+
for j := 1; j <= n; j++ {
232+
if s[i-1] == t[j-1] {
233+
f[i][j] = f[i-1][j-1] + 1
234+
a, b := 0, 0
235+
if i < m {
236+
a = g1[i]
237+
}
238+
if j < n {
239+
b = g2[j]
240+
}
241+
ans = max(ans, f[i][j]*2+a)
242+
ans = max(ans, f[i][j]*2+b)
243+
}
244+
}
245+
}
246+
return ans
247+
}
248+
249+
func calc(s string) []int {
250+
n, g := len(s), make([]int, len(s))
251+
for i := 0; i < n; i++ {
252+
expand(s, g, i, i)
253+
expand(s, g, i, i+1)
254+
}
255+
return g
256+
}
257+
258+
func expand(s string, g []int, l, r int) {
259+
for l >= 0 && r < len(s) && s[l] == s[r] {
260+
g[l] = max(g[l], r-l+1)
261+
l, r = l-1, r+1
262+
}
263+
}
264+
265+
func reverse(s string) string {
266+
r := []rune(s)
267+
slices.Reverse(r)
268+
return string(r)
269+
}
270+
```
117271

272+
#### TypeScript
273+
274+
```ts
275+
function longestPalindrome(s: string, t: string): number {
276+
function expand(s: string, g: number[], l: number, r: number): void {
277+
while (l >= 0 && r < s.length && s[l] === s[r]) {
278+
g[l] = Math.max(g[l], r - l + 1);
279+
l--;
280+
r++;
281+
}
282+
}
283+
284+
function calc(s: string): number[] {
285+
const n = s.length;
286+
const g: number[] = Array(n).fill(0);
287+
for (let i = 0; i < n; i++) {
288+
expand(s, g, i, i);
289+
expand(s, g, i, i + 1);
290+
}
291+
return g;
292+
}
293+
294+
const m = s.length,
295+
n = t.length;
296+
t = t.split('').reverse().join('');
297+
const g1 = calc(s);
298+
const g2 = calc(t);
299+
let ans = Math.max(...g1, ...g2);
300+
301+
const f: number[][] = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
302+
303+
for (let i = 1; i <= m; i++) {
304+
for (let j = 1; j <= n; j++) {
305+
if (s[i - 1] === t[j - 1]) {
306+
f[i][j] = f[i - 1][j - 1] + 1;
307+
ans = Math.max(ans, f[i][j] * 2 + (i >= m ? 0 : g1[i]));
308+
ans = Math.max(ans, f[i][j] * 2 + (j >= n ? 0 : g2[j]));
309+
}
310+
}
311+
}
312+
313+
return ans;
314+
}
118315
```
119316

120317
<!-- tabs:end -->

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /