File tree 3 files changed +89
-55
lines changed
solution/0000-0099/0005.Longest Palindromic Substring
3 files changed +89
-55
lines changed Original file line number Diff line number Diff line change @@ -362,30 +362,51 @@ function longestPalindrome(s: string): string {
362
362
``` rust
363
363
impl Solution {
364
364
pub fn longest_palindrome (s : String ) -> String {
365
- let n = s . len ();
366
- let s = s . as_bytes ();
367
- let is_pass = | mut l , mut r | {
368
- while l < r {
369
- if s [l ] != s [r ] {
370
- return false ;
365
+ let (n , mut ans ) = (s . len (), & s [.. 1 ]);
366
+ let mut dp = vec! [vec! [false ; n ]; n ];
367
+ let data : Vec <char > = s . chars (). collect ();
368
+
369
+ for end in 1 .. n {
370
+ for start in 0 ..= end {
371
+ if data [start ] == data [end ] {
372
+ dp [start ][end ] = end - start < 2 || dp [start + 1 ][end - 1 ];
373
+ if dp [start ][end ] && (end - start + 1 ) > ans . len () {
374
+ ans = & s [start ..= end ];
375
+ }
371
376
}
372
- l += 1 ;
373
- r -= 1 ;
374
377
}
375
- true
376
- };
377
- let mut res = & s [0 .. 1 ];
378
- for i in 0 .. n - 1 {
379
- for j in (i + 1 .. n ). rev () {
380
- if res . len () > j - i {
378
+ }
379
+ ans . to_string ()
380
+ }
381
+ }
382
+ ```
383
+
384
+ ``` rust
385
+ impl Solution {
386
+ pub fn is_palindrome (s : & str ) -> bool {
387
+ let mut chars = s . chars ();
388
+ while let (Some (c1 ), Some (c2 )) = (chars . next (), chars . next_back ()) {
389
+ if c1 != c2 {
390
+ return false ;
391
+ }
392
+ }
393
+ true
394
+ }
395
+
396
+ pub fn longest_palindrome (s : String ) -> String {
397
+ let size = s . len ();
398
+ let mut ans = & s [.. 1 ];
399
+ for i in 0 .. size - 1 {
400
+ for j in (i + 1 .. size ). rev () {
401
+ if ans . len () > j - i + 1 {
381
402
break ;
382
403
}
383
- if is_pass ( i , j ) {
384
- res = & s [i ..= j ];
404
+ if Solution :: is_palindrome ( & s [ i ..= j ] ) {
405
+ ans = & s [i ..= j ];
385
406
}
386
407
}
387
408
}
388
- res . into_iter () . map ( | c | char :: from ( * c )) . collect ()
409
+ return ans . to_string ();
389
410
}
390
411
}
391
412
```
Original file line number Diff line number Diff line change @@ -347,30 +347,51 @@ function longestPalindrome(s: string): string {
347
347
``` rust
348
348
impl Solution {
349
349
pub fn longest_palindrome (s : String ) -> String {
350
- let n = s . len ();
351
- let s = s . as_bytes ();
352
- let is_pass = | mut l , mut r | {
353
- while l < r {
354
- if s [l ] != s [r ] {
355
- return false ;
350
+ let (n , mut ans ) = (s . len (), & s [.. 1 ]);
351
+ let mut dp = vec! [vec! [false ; n ]; n ];
352
+ let data : Vec <char > = s . chars (). collect ();
353
+
354
+ for end in 1 .. n {
355
+ for start in 0 ..= end {
356
+ if data [start ] == data [end ] {
357
+ dp [start ][end ] = end - start < 2 || dp [start + 1 ][end - 1 ];
358
+ if dp [start ][end ] && (end - start + 1 ) > ans . len () {
359
+ ans = & s [start ..= end ];
360
+ }
356
361
}
357
- l += 1 ;
358
- r -= 1 ;
359
362
}
360
- true
361
- };
362
- let mut res = & s [0 .. 1 ];
363
- for i in 0 .. n - 1 {
364
- for j in (i + 1 .. n ). rev () {
365
- if res . len () > j - i {
363
+ }
364
+ ans . to_string ()
365
+ }
366
+ }
367
+ ```
368
+
369
+ ``` rust
370
+ impl Solution {
371
+ pub fn is_palindrome (s : & str ) -> bool {
372
+ let mut chars = s . chars ();
373
+ while let (Some (c1 ), Some (c2 )) = (chars . next (), chars . next_back ()) {
374
+ if c1 != c2 {
375
+ return false ;
376
+ }
377
+ }
378
+ true
379
+ }
380
+
381
+ pub fn longest_palindrome (s : String ) -> String {
382
+ let size = s . len ();
383
+ let mut ans = & s [.. 1 ];
384
+ for i in 0 .. size - 1 {
385
+ for j in (i + 1 .. size ). rev () {
386
+ if ans . len () > j - i + 1 {
366
387
break ;
367
388
}
368
- if is_pass ( i , j ) {
369
- res = & s [i ..= j ];
389
+ if Solution :: is_palindrome ( & s [ i ..= j ] ) {
390
+ ans = & s [i ..= j ];
370
391
}
371
392
}
372
393
}
373
- res . into_iter () . map ( | c | char :: from ( * c )) . collect ()
394
+ return ans . to_string ();
374
395
}
375
396
}
376
397
```
Original file line number Diff line number Diff line change 1
1
impl Solution {
2
2
pub fn longest_palindrome ( s : String ) -> String {
3
- let n = s. len ( ) ;
4
- let s = s. as_bytes ( ) ;
5
- let is_pass = |mut l, mut r| {
6
- while l < r {
7
- if s[ l] != s[ r] {
8
- return false ;
9
- }
10
- l += 1 ;
11
- r -= 1 ;
12
- }
13
- true
14
- } ;
15
- let mut res = & s[ 0 ..1 ] ;
16
- for i in 0 ..n - 1 {
17
- for j in ( i + 1 ..n) . rev ( ) {
18
- if res. len ( ) > j - i {
19
- break ;
20
- }
21
- if is_pass ( i, j) {
22
- res = & s[ i..=j] ;
3
+ let ( n, mut ans) = ( s. len ( ) , & s[ ..1 ] ) ;
4
+ let mut dp = vec ! [ vec![ false ; n] ; n] ;
5
+ let data: Vec < char > = s. chars ( ) . collect ( ) ;
6
+
7
+ for end in 1 ..n {
8
+ for start in 0 ..=end {
9
+ if data[ start] == data[ end] {
10
+ dp[ start] [ end] = end - start < 2 || dp[ start + 1 ] [ end - 1 ] ;
11
+ if dp[ start] [ end] && ( end - start + 1 ) > ans. len ( ) {
12
+ ans = & s[ start..=end] ;
13
+ }
23
14
}
24
15
}
25
16
}
26
- res . into_iter ( ) . map ( |c| char :: from ( * c ) ) . collect ( )
17
+ ans . to_string ( )
27
18
}
28
19
}
20
+
You can’t perform that action at this time.
0 commit comments