# -*- coding: utf8 -*-
'''
__author__ = 'dabay.wang@gmail.com'
https://oj.leetcode.com/problems/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. ===Comments by Dabay===
从最长的字符串开始判断,直到长度为2。但是这样的算法会超时Time Limit Exceeded。
使用一个著名的算法,叫Manacher's ALGORITHM:
每一个字符之间加上一个#来隔开,遍历的时候,从每个字符往两边延生,记录最长子串的长度。
这里加入#,避免了回文字符串是奇数或偶数的问题。
最后,在生成的记录长度的数组中,找到最大回文子串即可。 S # a # b # b # a # b # c # b # a #
P 1 2 1 2 5 2 1 4 1 2 1 6 1 2 1 2 1 mid记录包含最大右边界的回文子串的中心位置,max_right记录最大子串的右边界。 初始化位置0 对于每一个位置i
如果i不超过max_right:
判断基于mid对称点的回文长度是否超过边界
如果没有超过边界:
不用继续判断了,直接赋值为这个对称点的值,继续判断下一个i
如果超过边界:
在边界内的部分不用判断了(因为对称性,肯定是回文),继续寻找最长回文,记录长度
如果i超过了max_right:
寻找最长回文,记录长度 如果max_right得到了拓展,更新mid和max_right
'''
class Solution:
# @return a string
def longestPalindrome(self, s):
s_list = ['#']
for c in s:
s_list.append(c)
s_list.append('#') max_right = 0
mid = 0
p = [0 for _ in s_list]
p[0] = 1 for i in xrange(1, len(p)):
if i <= max_right:
if p[2*mid-i] < max_right-i:
p[i] = p[2*mid-i]
continue
else:
j = max_right - i
while i + j < len(s_list) and i - j >= 0 and s_list[i+j] == s_list[i-j]:
j = j + 1
p[i] = j
else:
j = 1
while i + j < len(s_list) and i - j >= 0 and s_list[i+j] == s_list[i-j]:
j = j + 1
p[i] = j
if max_right < p[i] + i - 1:
max_right = p[i] + i - 1
mid = i max_p = max(p)
max_index = p.index(max_p) longest = ""
for i in range(max_index-max_p+1, max_index+max_p):
if s_list[i] == '#':
continue
longest = longest + s_list[i]
return longest def main():
s = Solution()
string = "cubwqvhxdammpkwkycrqtegepyxtohspeasrdtinjhbesilsvffmnzznmltsspjwuogdyzvanalohmzrywdwqqcukjceothydlgtocukc"
#string = "abbabcba"
print s.longestPalindrome(string) if __name__ == "__main__":
import time
start = time.clock()
main()
print "%s sec" % (time.clock() - start)

[LeetCode][Python]Longest Palindromic Substring的更多相关文章

  1. LeetCode(4) || Longest Palindromic Substring 与 Manacher 线性算法

    LeetCode(4) || Longest Palindromic Substring 与 Manacher 线性算法 题记 本文是LeetCode题库的第五题,没想到做这些题的速度会这么慢,工作之 ...

  2. Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法)

    Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法) Given a string s, find the longest pal ...

  3. 求最长回文子串 - leetcode 5. Longest Palindromic Substring

    写在前面:忍不住吐槽几句今天上海的天气,次奥,鞋子里都能养鱼了...裤子也全湿了,衣服也全湿了,关键是这天气还打空调,只能瑟瑟发抖祈祷不要感冒了.... 前后切了一百零几道leetcode的题(sol ...

  4. LeetCode 5 Longest Palindromic Substring(最长子序列)

    题目来源:https://leetcode.com/problems/longest-palindromic-substring/ Given a string S, find the longest ...

  5. 【JAVA、C++】LeetCode 005 Longest Palindromic Substring

    Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...

  6. leetcode:Longest Palindromic Substring(求最大的回文字符串)

    Question:Given a string S, find the longest palindromic substring in S. You may assume that the maxi ...

  7. leetcode 5 :Longest Palindromic Substring 找出最长回文子串

    题目: Given a string S, find the longest palindromic substring in S. You may assume that the maximum l ...

  8. 蜗牛慢慢爬 LeetCode 5.Longest Palindromic Substring [Difficulty: Medium]

    题目 Given a string s, find the longest palindromic substring in s. You may assume that the maximum le ...

  9. 【LeetCode】Longest Palindromic Substring 解题报告

    DP.KMP什么的都太高大上了.自己想了个朴素的遍历方法. [题目] Given a string S, find the longest palindromic substring in S. Yo ...

随机推荐

  1. Sublime_调试PHP编译系统设置.

    工具->编译系统->新建编译系统 {         "cmd": ["C:\\wampserver\\bin\\php\\php5.3.13\\php.ex ...

  2. android studio SVN的搭建

    android studio 安装 SVN:http://www.it165.net/pro/html/201404/11412.html http://jingyan.baidu.com/album ...

  3. Struts2命名空间问题

    警告: No configuration found for the specified action: '/myNameSpace/login.action' in names 今天花了点时间把st ...

  4. Emacs配置erlang开发环境(.emacs 文件)

    以前都是用sublime写erlang代码,好处不多说,主要是觉得一点不好用,不能实现函数跳转,及其不方便,尤其是代码一多,头疼.后来折腾过IntelliJ,下了个收费$0.00的版本,风格还是挺稀饭 ...

  5. 《C语言深度剖析》学习笔记----C语言中的符号

    本节主要讲C语言中的各种符号,包括注释符.单引号双信号以及逻辑运算符等. 一.注释符 注释符号和注释在程序的预编译期就已经被解决了,在预编译期间,编译器会将注释符号和注释符号之间的部分简单的替换成为空 ...

  6. StudentSchema student实例数据库环境搭建

    环境搭建 查看默认表空间和临时表空间 select tablespace_name from dba_tablespaces: 创建用户 并给用户设置默认表空间和临时表空间 SQL> creat ...

  7. Linux学习之十三、快捷键与通配符、数据流重导向

    通配符与特殊符号 接下来让我们利用通配符来玩些东西吧!首先,利用通配符配合 ls 找檔名看看: [root@www ~]# LANG=C              <==由于与编码有关,先配置语 ...

  8. wx.BookCtrlBase

    wx.BookCtrlBase A book control is a convenient way of displaying multiple pages of information, disp ...

  9. Effective C++ 条款18

    让接口easy被正确使用,不easy被误用 如题目,我们自己的程序接口是面向用户的,程序的目的不可是解决这个问题,并且要让用户easy使用.所以.必须保证我们的程序接口具有非常强的鲁棒性. 怎么保证接 ...

  10. Ubuntu Code::Blocks IDE 13.12 汉化

    Ubuntu Code::Blocks IDE 13.12 汉化: 安装很简单,不再赘述. 单说汉化: .下载中文简体汉化包(百度网盘):链接: http://pan.baidu.com/s/1kU3 ...