Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
Manacher Algorithm:
1 public class Solution { 2 public String longestPalindrome(String s) { 3 4 if (s == null || s.length() < 2) { 5 return s; 6 } 7 8 char[] c = new char[2 * s.length() + 3]; 9 c[0] = '$'; 10 c[1] = '#'; 11 c[c.length - 1] = '\0'; 12 for (int i = 0; i < s.length(); i++) { 13 c[2 * i + 2] = s.charAt(i); 14 c[2 * i + 3] = '#'; 15 } 16 17 int[] p = new int[c.length]; 18 p[0] = p[p.length - 1] = 0; 19 20 int mx = 0; 21 int id = 0; 22 for (int i = 1; i < p.length - 1; i++) { 23 if (mx > i) { 24 p[i] = Math.min(p[2 * id - i], mx - i); 25 } else { 26 p[i] = 1; 27 } 28 while (c[i + p[i]] == c[i - p[i]]) { 29 p[i]++; 30 } 31 if (i + p[i] > mx) { 32 mx = i + p[i]; 33 id = i; 34 } 35 } 36 37 int maxp = 0; 38 int maxi = 0; 39 for (int i = 0; i < p.length; i++) { 40 if (p[i] > maxp) { 41 maxp = p[i]; 42 maxi = i; 43 } 44 } 45 46 StringBuilder sb = new StringBuilder(maxp - 1); 47 for (int i = maxi - maxp + 2; i < maxi + maxp; i += 2) { 48 sb.append(c[i]); 49 } 50 51 return sb.toString(); 52 } 53 }
DP:
1 public class Solution { 2 public String longestPalindrome(String s) { 3 if (s == null || s.length() < 2) { 4 return s; 5 } 6 boolean[] flags = new boolean[s.length()]; 7 flags[1] = true; 8 int maxi = 0; 9 int maxj = 0; 10 for (int j = 0; j < s.length(); j++) { 11 int i = 0; 12 for (; i < j; i++) { 13 if (flags[i + 1] && s.charAt(i) == s.charAt(j)) { 14 flags[i] = true; 15 if (j - i > maxj - maxi) { 16 maxi = i; 17 maxj = j; 18 } 19 } else { 20 flags[i] = false; 21 } 22 } 23 flags[j] = true; 24 if (j + 1 < s.length()) { 25 flags[j + 1] = true; 26 } 27 } 28 return s.substring(maxi, maxj + 1); 29 } 30 }

浙公网安备 33010602011771号