Skip to content

Commit

Permalink
add solution
Browse files Browse the repository at this point in the history
  • Loading branch information
applewjg committed Dec 13, 2014
1 parent aeb439c commit a970ed5
Showing 1 changed file with 30 additions and 2 deletions.
32 changes: 30 additions & 2 deletions LongestPalindromicSubstring.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@
2. Time O(n^2), Space O(n)
3. Time O(n^2), Space O(1) (actually much more efficient than 1 & 2)
4. Time O(n), Space O(n) (Manacher's Algorithm)
5. Time O(n), Smaller Space than solution 4. (Manacher's Algorithm)
*/

public class Solution {
public String longestPalindrome_1(String s) {
int n = s.length();
Expand Down Expand Up @@ -73,12 +75,12 @@ public String longestPalindrome_4(String s) {
sb.append(s.charAt(i));
}
sb.append("#$");
n = 2 * n + 2;
n = 2 * n + 3;
int mx = 0, id = 0;
int[] p = new int[n];
Arrays.fill(p,0);
for (int i = 1; i < n - 1; ++i) {
p[i] = (mx > i) ? Math.min(p[2 * id - i], mx - i): 0;
p[i] = (mx > i) ? Math.min(p[2 * id - i], mx - i) : 0;
while (sb.charAt(i + 1 + p[i]) == sb.charAt(i - 1 - p[i])) ++p[i];
if (i + p[i] > mx) {
id = i; mx = i + p[i];
Expand All @@ -90,4 +92,30 @@ public String longestPalindrome_4(String s) {
idx = (idx - maxLen - 1) / 2;
return s.substring(idx, idx + maxLen);
}
public String longestPalindrome_5(String s) {
int n = s.length();
int idx = 0, maxLen = 0;
int mx = 0, id = 0;
int[] p = new int[2*n+1];
Arrays.fill(p,0);
for (int i = 0; i < 2*n+1; ++i) {
p[i] = (mx > i) ? Math.min(p[2*id-i], mx - i) : 0;
int left = i - 1 - p[i], right = i + 1 + p[i];
while (left>=0 && right <= 2*n) {
if (left % 2 == 0 || s.charAt(left/2) == s.charAt(right/2)) {
++p[i];
} else break;
--left;
++right;
}
if (i + p[i] > mx) {
id = i; mx = i + p[i];
}
if (p[i] > maxLen) {
idx = i; maxLen = p[i];
}
}
idx = (idx - maxLen) / 2;
return s.substring(idx, idx + maxLen);
}
}

0 comments on commit a970ed5

Please sign in to comment.