果果1020

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

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 }

 

posted on 2017-01-02 12:25  果果1020  阅读(107)  评论(0)    收藏  举报