Skip to content

Commit c8a256f

Browse files
solves longest palindromic substring
1 parent 678ed88 commit c8a256f

File tree

2 files changed

+20
-25
lines changed

2 files changed

+20
-25
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
| 1 | [Two Sum](https://leetcode.com/problems/two-sum/) | [![Java](assets/java.png)](src/TwoSum.java) [![Python](assets/python.png)](python/two_sum.py) | [![java-yt](assets/java-yt.png)](https://youtu.be/9wSL_7NN-A8) [![python-yt](assets/python-yt.png)](https://youtu.be/N5FXCTg0TDE) |
1515
| 2 | [Add Two Numbers](https://leetcode.com/problems/add-two-numbers) | [![Java](assets/java.png)](src/AddTwoNumbers.java) | |
1616
| 3 | [Longest Substring Without Repeating Characters](https://leetcode.com/problems/longest-substring-without-repeating-characters) | [![Java](assets/java.png)](src/LongestSubstringWithoutRepeatingCharacters.java) | |
17+
| 5 | [Longest Palindromic Substring](https://leetcode.com/problems/longest-palindromic-substring) | [![Java](assets/java.png)](src/LongestPalindromicSubstring.java) | |
1718
| 7 | [Reverse Integer](https://leetcode.com/problems/reverse-integer/) | [![Java](assets/java.png)](src/ReverseInteger.java) [![Python](assets/python.png)](python/reverse_integer.py) | [![java-yt](assets/java-yt.png)](https://youtu.be/7bOhyl5lWjI) [![python-yt](assets/python-yt.png)](https://youtu.be/lmLG30TLcSg) |
1819
| 9 | [PalindromeNumber](https://leetcode.com/problems/palindrome-number/) | [![Java](assets/java.png)](src/PalindromeNumber.java) [![Python](assets/python.png)](python/palindrome_number.py) | |
1920
| 13 | [Roman To Integer](https://leetcode.com/problems/roman-to-integer/) | [![Java](assets/java.png)](src/RomanToInteger.java) [![Python](assets/python.png)](python/roman_to_integer.py) | [![java-yt](assets/java-yt.png)](https://youtu.be/BCue_mO_81A) [![python-yt](assets/python-yt.png)](https://youtu.be/8h_yGTNvKMA) |
Lines changed: 19 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,29 @@
11
// https://leetcode.com/problems/longest-palindromic-substring
2+
// T: O(n^2)
3+
// S: O(1)
24

35
public class LongestPalindromicSubstring {
4-
public static void main(String[] args) {
5-
System.out.println(isPalindrome("caba", 1, 4));
6-
}
7-
8-
public static String longestPalindrome(String s) {
9-
final String s2 = new StringBuilder(s).reverse().toString();
10-
final int rows = s.length() + 1, columns = s2.length() + 1;
11-
final int[][] dp = new int[2][columns];
12-
int maxLength = 0, startIndex = -1;
13-
14-
for (int row = 1, i = 1 ; row < rows ; row++, i ^= 1) {
15-
for (int column = 1 ; column < columns ; column++) {
16-
dp[i][column] = s.charAt(row - 1) == s2.charAt(column - 1) ? dp[i ^ 1][column - 1] + 1 : 0;
17-
if (dp[i][column] > maxLength && isPalindrome(s, row - dp[i][column], row)) {
18-
maxLength = dp[i][column];
19-
startIndex = row - maxLength;
20-
}
6+
public String longestPalindrome(String s) {
7+
if (s.length() < 2) return s;
8+
int maxLen = 0, startIndex = -1;
9+
for (int i = 0, len ; i < s.length() - 1 ; i++) {
10+
len = palindromeLengthFromCenter(s, i, i);
11+
if (s.charAt(i) == s.charAt(i + 1)) {
12+
len = Math.max(len, palindromeLengthFromCenter(s, i, i + 1));
13+
}
14+
if (len > maxLen) {
15+
maxLen = len;
16+
startIndex = i - (maxLen - 1) / 2;
2117
}
2218
}
23-
24-
return s.substring(startIndex, startIndex + maxLength);
19+
return s.substring(startIndex, startIndex + maxLen);
2520
}
2621

27-
private static boolean isPalindrome(String s, int start, int end) {
28-
for (int i = start ; i < start + (end - start) / 2 ; i++) {
29-
if (s.charAt(i) != s.charAt(end - i - 1 + start)) {
30-
return false;
31-
}
22+
private int palindromeLengthFromCenter(String s, int left, int right) {
23+
while (left - 1 >= 0 && right + 1 < s.length() && s.charAt(left - 1) == s.charAt(right + 1)) {
24+
left--;
25+
right++;
3226
}
33-
return true;
27+
return right - left + 1;
3428
}
3529
}

0 commit comments

Comments
 (0)