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 }