5. Longest Palindromic Substring
来源:互联网 发布:apache服务器优点 编辑:程序博客网 时间:2024/06/05 23:40
题意: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]
0 0
- 5.Longest Palindromic Substring
- 5. Longest Palindromic Substring
- 5. Longest Palindromic Substring
- 5.Longest Palindromic Substring
- 5. Longest Palindromic Substring
- 5.Longest Palindromic Substring
- 5. Longest Palindromic Substring
- 5. Longest Palindromic Substring
- 5. Longest Palindromic Substring
- 5.Longest Palindromic Substring
- 5. Longest Palindromic Substring
- 5. Longest Palindromic Substring
- 5. Longest Palindromic Substring
- 5. Longest Palindromic Substring
- 5. Longest Palindromic Substring
- 5. Longest Palindromic Substring
- 5. Longest Palindromic Substring
- 5. Longest Palindromic Substring
- Java之路(一) 一切皆对象
- 兔子-IllegalArgumentException: cannot add an action twice: Generate Butterknife Injections (
- zoj1154
- 将博客搬至CSDN
- JavaSE Get和Post传递参数乱码
- 5. Longest Palindromic Substring
- sklearn.GBDT 源码解读(宏观把握)
- Java创建和结束线程
- Java I/O流详解
- 编程之路(各种技术的路线图)
- 个人记录-LeetCode 78. Subsets
- 安装Ubuntu
- 11、数值的整数次方
- 欢迎使用CSDN-markdown编辑器