Skip to content

Commit b38a12b

Browse files
authored
Improved task 5.
1 parent 02272d9 commit b38a12b

File tree

1 file changed

+26
-24
lines changed

1 file changed

+26
-24
lines changed

src/main/java/s0005_longest_palindromic_substring/Solution.java

+26-24
Original file line numberDiff line numberDiff line change
@@ -2,32 +2,34 @@
22

33
public class Solution {
44
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] = '#';
2110
}
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];
2931
}
3032
}
31-
return true;
33+
return s.substring((lpsCenter - lpsRadius + 1) / 2, (lpsCenter + lpsRadius - 1) / 2);
3234
}
3335
}

0 commit comments

Comments
 (0)