您的位置:首页 > 编程语言 > Python开发

5. Longest Palindromic Substring

2017-01-09 20:53 267 查看
题意:Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

Example:

Input: “babad”

Output: “bab”

Note: “aba” is also a valid answer.

Example:

Input: “cbbd”

Output: “bb”

思路:这题一开始想用循环做,但是由于奇数字符和偶数字符回环串的判定方式不同,所以一开始写了一堆的if条件,最后还一直WA,但是后来看到一个哥们的一串java代码,我才发现自己想多了,可能是冬天空调吹傻了。。。

参考代码:

public class Solution {
private int lo, maxLen;

public String longestPalindrome(String s) {
int len = s.length();
if (len < 2)
return s;

for (int i = 0; i < len-1; i++) {
extendPalindrome(s, i, i);  //assume odd length, try to extend Palindrome as possible
extendPalindrome(s, i, i+1); //assume even length.
}
return s.substring(lo, lo + maxLen);
}

private void extendPalindrome(String s, int j, int k) {
while (j >= 0 && k < s.length() && s.charAt(j) == s.charAt(k)) {
j--;
k++;
}
if (maxLen < k - j - 1) {
lo = j + 1;
maxLen = k - j - 1;
}
}
}


但是这个方法的复杂度还是O(n^2)的,但其实这里还有一个Manacher’s algorithm,可以在O(n)的复杂度下完成,附一个我认为最好理解的一个博客 Manacher’s algorithm,这个博客讲的比较通俗,具体算法我就不说了,主要是要去理解,前面算过的较长的环回串对之后的字串会有帮助,所以不用像以前那样去遍历了:

class Solution(object):
def longestPalindrome(self, s):
T = ['#']
for i in s:
T += ['#', i]
T += ['#', '$']
mx, id = 0, 0
P = [0] * len(T)
for i in xrange(1, len(T)-1):
if mx > i:
P[i] = min(P[2 * id - i], mx-i)
else:
P[i] = 1
while T[i + P[i]] == T[i - P[i]]:
P[i] += 1
if i+P[i] > mx:
mx = i + P[i]
id = i
max, max_idx = 0, 0
for i in xrange(len(P)):
if P[i] > max:
max, max_idx = P[i], i
return s[(max_idx-max)/2:(max_idx+max)/2-1]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python leetcode