|
2 | 2 |
|
3 | 3 | public class Solution {
|
4 | 4 | public String longestPalindrome(String s) {
|
5 |
| - int start = 0, end = 0; |
6 |
| - char[] cs = s.toCharArray(); |
7 |
| - for (int i = 0, max = 0, prev = 0; i < cs.length; ++i) { |
8 |
| - if (i - max - 1 >= 0 |
9 |
| - && cs[i - max - 1] == cs[i] |
10 |
| - && (prev == i - 1 || isPalindrome(cs, i - max, i))) { |
11 |
| - start = i - max - 1; |
12 |
| - end = i + 1; |
13 |
| - max += 2; |
14 |
| - prev = i; |
15 |
| - } else if (isPalindrome(cs, i - max, i + 1)) { |
16 |
| - start = i - max; |
17 |
| - end = i + 1; |
18 |
| - ++max; |
19 |
| - prev = i; |
20 |
| - } |
| 5 | + char[] newStr = new char[s.length() * 2 + 1]; |
| 6 | + newStr[0] = '#'; |
| 7 | + for (int i = 0; i < s.length(); i++) { |
| 8 | + newStr[2 * i + 1] = s.charAt(i); |
| 9 | + newStr[2 * i + 2] = '#'; |
21 | 10 | }
|
22 |
| - return s.substring(start, end); |
23 |
| - } |
24 |
| - |
25 |
| - private static boolean isPalindrome(char[] cs, int start, int end) { |
26 |
| - for (int i = start, j = end - 1; i < j; ++i, --j) { |
27 |
| - if (cs[i] != cs[j]) { |
28 |
| - return false; |
| 11 | + int[] dp = new int[newStr.length]; |
| 12 | + int friendCenter = 0; |
| 13 | + int friendRadius = 0; |
| 14 | + int lpsCenter = 0; |
| 15 | + int lpsRadius = 0; |
| 16 | + for (int i = 0; i < newStr.length; i++) { |
| 17 | + dp[i] = |
| 18 | + friendCenter + friendRadius > i |
| 19 | + ? Math.min(dp[friendCenter * 2 - i], (friendCenter + friendRadius) - i) |
| 20 | + : 1; |
| 21 | + while (i + dp[i] < newStr.length |
| 22 | + && i - dp[i] >= 0 |
| 23 | + && newStr[i + dp[i]] == newStr[i - dp[i]]) dp[i]++; |
| 24 | + if (friendCenter + friendRadius < i + dp[i]) { |
| 25 | + friendCenter = i; |
| 26 | + friendRadius = dp[i]; |
| 27 | + } |
| 28 | + if (lpsRadius < dp[i]) { |
| 29 | + lpsCenter = i; |
| 30 | + lpsRadius = dp[i]; |
29 | 31 | }
|
30 | 32 | }
|
31 |
| - return true; |
| 33 | + return s.substring((lpsCenter - lpsRadius + 1) / 2, (lpsCenter + lpsRadius - 1) / 2); |
32 | 34 | }
|
33 | 35 | }
|
0 commit comments