File tree 6 files changed +231
-0
lines changed
Medium/5. Longest Palindromic Substring
6 files changed +231
-0
lines changed Original file line number Diff line number Diff line change
1
+ class Solution {
2
+ public String longestPalindrome (String s ) {
3
+ int len = s .length ();
4
+
5
+ if (len <= 1 ) {
6
+ return s ;
7
+ }
8
+
9
+ boolean [][] dp = new boolean [len ][len ];
10
+ int start = 0 ;
11
+ int maxLen = 1 ;
12
+
13
+ // All substrings of length 1 are palindromes.
14
+ for (int i = 0 ; i < len ; i ++) {
15
+ dp [i ][i ] = true ;
16
+ }
17
+
18
+ // Check for palindromes of length 2.
19
+ for (int i = 0 ; i < len - 1 ; i ++) {
20
+ if (s .charAt (i ) == s .charAt (i + 1 )) {
21
+ dp [i ][i + 1 ] = true ;
22
+ start = i ;
23
+ maxLen = 2 ;
24
+ }
25
+ }
26
+
27
+ // Check for palindromes of length greater than 2.
28
+ for (int k = 3 ; k <= len ; k ++) {
29
+ for (int i = 0 ; i <= len - k ; i ++) {
30
+ int j = i + k - 1 ;
31
+
32
+ if (dp [i + 1 ][j - 1 ] && s .charAt (i ) == s .charAt (j )) {
33
+ dp [i ][j ] = true ;
34
+
35
+ if (k > maxLen ) {
36
+ start = i ;
37
+ maxLen = k ;
38
+ }
39
+ }
40
+ }
41
+ }
42
+
43
+ return s .substring (start , start + maxLen );
44
+ }
45
+ }
Original file line number Diff line number Diff line change
1
+ /**
2
+ * @param {string } s
3
+ * @return {string }
4
+ */
5
+ var longestPalindrome = function ( s ) {
6
+ const len = s . length ;
7
+
8
+ if ( len <= 1 ) {
9
+ return s ;
10
+ }
11
+
12
+ let start = 0 ;
13
+ let maxLen = 1 ;
14
+
15
+ const dp = new Array ( len ) . fill ( false ) . map ( ( ) => new Array ( len ) . fill ( false ) ) ;
16
+
17
+ // All substrings of length 1 are palindromes.
18
+ for ( let i = 0 ; i < len ; i ++ ) {
19
+ dp [ i ] [ i ] = true ;
20
+ }
21
+
22
+ // Check for palindromes of length 2.
23
+ for ( let i = 0 ; i < len - 1 ; i ++ ) {
24
+ if ( s [ i ] === s [ i + 1 ] ) {
25
+ dp [ i ] [ i + 1 ] = true ;
26
+ start = i ;
27
+ maxLen = 2 ;
28
+ }
29
+ }
30
+
31
+ // Check for palindromes of length greater than 2.
32
+ for ( let k = 3 ; k <= len ; k ++ ) {
33
+ for ( let i = 0 ; i <= len - k ; i ++ ) {
34
+ const j = i + k - 1 ;
35
+
36
+ if ( dp [ i + 1 ] [ j - 1 ] && s [ i ] === s [ j ] ) {
37
+ dp [ i ] [ j ] = true ;
38
+
39
+ if ( k > maxLen ) {
40
+ start = i ;
41
+ maxLen = k ;
42
+ }
43
+ }
44
+ }
45
+ }
46
+
47
+ return s . substring ( start , start + maxLen ) ;
48
+ } ;
Original file line number Diff line number Diff line change
1
+ class Solution :
2
+ def longestPalindrome (self , s : str ) -> str :
3
+ def expandAroundCenter (left , right ):
4
+ while left >= 0 and right < len (s ) and s [left ] == s [right ]:
5
+ left -= 1
6
+ right += 1
7
+ return s [left + 1 : right ]
8
+
9
+ longest = ""
10
+
11
+ for i in range (len (s )):
12
+ # Odd length palindrome
13
+ palindrome1 = expandAroundCenter (i , i )
14
+ if len (palindrome1 ) > len (longest ):
15
+ longest = palindrome1
16
+
17
+ # Even length palindrome
18
+ palindrome2 = expandAroundCenter (i , i + 1 )
19
+ if len (palindrome2 ) > len (longest ):
20
+ longest = palindrome2
21
+
22
+ return longest
Original file line number Diff line number Diff line change
1
+ impl Solution {
2
+ pub fn longest_palindrome ( s : String ) -> String {
3
+ let chars: Vec < char > = s. chars ( ) . collect ( ) ;
4
+ let len = chars. len ( ) ;
5
+
6
+ if len <= 1 {
7
+ return s;
8
+ }
9
+
10
+ let mut dp = vec ! [ vec![ false ; len] ; len] ;
11
+ let mut start = 0 ;
12
+ let mut max_len = 1 ;
13
+
14
+ // All substrings of length 1 are palindromes.
15
+ for i in 0 ..len {
16
+ dp[ i] [ i] = true ;
17
+ }
18
+
19
+ // Check for palindromes of length 2.
20
+ for i in 0 ..len - 1 {
21
+ if chars[ i] == chars[ i + 1 ] {
22
+ dp[ i] [ i + 1 ] = true ;
23
+ start = i;
24
+ max_len = 2 ;
25
+ }
26
+ }
27
+
28
+ // Check for palindromes of length greater than 2.
29
+ for k in 3 ..=len {
30
+ for i in 0 ..( len - k + 1 ) {
31
+ let j = i + k - 1 ;
32
+
33
+ if dp[ i + 1 ] [ j - 1 ] && chars[ i] == chars[ j] {
34
+ dp[ i] [ j] = true ;
35
+
36
+ if k > max_len {
37
+ start = i;
38
+ max_len = k;
39
+ }
40
+ }
41
+ }
42
+ }
43
+
44
+ chars[ start..start + max_len] . iter ( ) . collect ( )
45
+ }
46
+ }
Original file line number Diff line number Diff line change
1
+ function longestPalindrome ( s : string ) : string {
2
+ const len = s . length ;
3
+
4
+ if ( len <= 1 ) {
5
+ return s ;
6
+ }
7
+
8
+ let start = 0 ;
9
+ let maxLen = 1 ;
10
+
11
+ const dp : boolean [ ] [ ] = new Array ( len )
12
+ . fill ( 0 )
13
+ . map ( ( ) => new Array ( len ) . fill ( false ) ) ;
14
+
15
+ // All substrings of length 1 are palindromes.
16
+ for ( let i = 0 ; i < len ; i ++ ) {
17
+ dp [ i ] [ i ] = true ;
18
+ }
19
+
20
+ // Check for palindromes of length 2.
21
+ for ( let i = 0 ; i < len - 1 ; i ++ ) {
22
+ if ( s [ i ] === s [ i + 1 ] ) {
23
+ dp [ i ] [ i + 1 ] = true ;
24
+ start = i ;
25
+ maxLen = 2 ;
26
+ }
27
+ }
28
+
29
+ // Check for palindromes of length greater than 2.
30
+ for ( let k = 3 ; k <= len ; k ++ ) {
31
+ for ( let i = 0 ; i <= len - k ; i ++ ) {
32
+ const j = i + k - 1 ;
33
+
34
+ if ( dp [ i + 1 ] [ j - 1 ] && s [ i ] === s [ j ] ) {
35
+ dp [ i ] [ j ] = true ;
36
+
37
+ if ( k > maxLen ) {
38
+ start = i ;
39
+ maxLen = k ;
40
+ }
41
+ }
42
+ }
43
+ }
44
+
45
+ return s . substring ( start , start + maxLen ) ;
46
+ }
Original file line number Diff line number Diff line change
1
+ ## [ 5. Longest Palindromic Substring] ( https://leetcode.com/problems/longest-palindromic-substring )
2
+
3
+ Given a string ` s ` , return _ the longest
4
+ palindromic substring in ` s ` _ .
5
+
6
+ #### Example 1:
7
+
8
+ <pre >
9
+ <strong >Input:</strong > s = "babad"
10
+ <strong >Output:</strong > "bab"
11
+ <strong >Explanation:</strong > "aba" is also a valid answer.
12
+ </pre >
13
+
14
+ #### Example 2:
15
+
16
+ <pre >
17
+ <strong >Input:</strong > s = "cbbd"
18
+ <strong >Output:</strong > "bb"
19
+ </pre >
20
+
21
+ #### Constraints:
22
+
23
+ - ` 1 <= s.length <= 1000 `
24
+ - ` s ` consist of only digits and English letters.
You can’t perform that action at this time.
0 commit comments