LeetCode 5 - Longest Palindromic Substring

原题如下:

Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.

如果选择任一子串,计算子串是否互文,然后取最大的子串,其时间复杂度为O(n*n*n)=O(n^3),这肯定是过不了测试的。

另一种方法是选择某一字符,以此字符为中心,分别向左右两边扩展,计算以此字符为中心的最大互文字符串。当然需要注意,如果子串长度为偶数,则是以两个字符为中心。这个方法最坏的时间复杂度为O(2*n*n)=O(n^2)。最坏情况出现在字符串都是相同字符的情况,可以做一下优化处理,这样时间复杂度可以进一步下降。具体算法见如下代码:

 1     public String longestPalindrome(String s) {
 2         if (s.length() < 2) {
 3             return s;
 4         }
 5         int maxLen = 1;
 6         int maxi = 0;
 7         int maxj = 1;
 8         for (int i = 1; i < s.length()-maxLen/2-1; i++) {
 9             if (s.charAt(i) == s.charAt(i + 1) || s.charAt(i) == s.charAt(i - 1)) {
10                 continue;
11             }
12             int j = 1;
13             for (; i - j >= 0 && i + j < s.length() && s.charAt(i - j) == s.charAt(i + j); j++);
14             int len = --j * 2 + 1;
15             if (len > maxLen) {
16                 maxLen = len;
17                 maxi = i - j;
18                 maxj = i + j + 1;
19             }
20         }
21         for (int i = 0; i < s.length()-maxLen/2;) {
22             int j = i;
23             for (; j + 1 < s.length() && s.charAt(j) == s.charAt(j + 1); j++);
24             if(i != j) {
25                 int ii = i, jj = j;
26                 while (ii >= 0 && jj < s.length() && s.charAt(ii) == s.charAt(jj)) {
27                     ii--;
28                     jj++;
29                 }
30                 ii++;
31                 jj--;
32                 int len = jj-ii+1;
33                 if (len > maxLen) {
34                     maxLen = len;
35                     maxi = ii;
36                     maxj = jj + 1;
37                 }
38             }
39             i = j + 1;
40         }
41         return s.substring(maxi, maxj);
42     }

参考源码:https://github.com/pkufork/Martians/blob/master/src/main/java/com/pkufork/martians/leetcode/L5_LongestPalindromicSubstring.java

posted @ 2016-08-15 17:42  pkufork  阅读(415)  评论(0编辑  收藏  举报