[LeetCode][Python]Longest Palindromic Substring
# -*- 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的更多相关文章
- LeetCode(4) || Longest Palindromic Substring 与 Manacher 线性算法
LeetCode(4) || Longest Palindromic Substring 与 Manacher 线性算法 题记 本文是LeetCode题库的第五题,没想到做这些题的速度会这么慢,工作之 ...
- Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法)
Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法) Given a string s, find the longest pal ...
- 求最长回文子串 - leetcode 5. Longest Palindromic Substring
写在前面:忍不住吐槽几句今天上海的天气,次奥,鞋子里都能养鱼了...裤子也全湿了,衣服也全湿了,关键是这天气还打空调,只能瑟瑟发抖祈祷不要感冒了.... 前后切了一百零几道leetcode的题(sol ...
- LeetCode 5 Longest Palindromic Substring(最长子序列)
题目来源:https://leetcode.com/problems/longest-palindromic-substring/ Given a string S, find the longest ...
- 【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 ...
- leetcode:Longest Palindromic Substring(求最大的回文字符串)
Question:Given a string S, find the longest palindromic substring in S. You may assume that the maxi ...
- leetcode 5 :Longest Palindromic Substring 找出最长回文子串
题目: Given a string S, find the longest palindromic substring in S. You may assume that the maximum l ...
- 蜗牛慢慢爬 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 ...
- 【LeetCode】Longest Palindromic Substring 解题报告
DP.KMP什么的都太高大上了.自己想了个朴素的遍历方法. [题目] Given a string S, find the longest palindromic substring in S. Yo ...
随机推荐
- Sublime_调试PHP编译系统设置.
工具->编译系统->新建编译系统 { "cmd": ["C:\\wampserver\\bin\\php\\php5.3.13\\php.ex ...
- android studio SVN的搭建
android studio 安装 SVN:http://www.it165.net/pro/html/201404/11412.html http://jingyan.baidu.com/album ...
- Struts2命名空间问题
警告: No configuration found for the specified action: '/myNameSpace/login.action' in names 今天花了点时间把st ...
- Emacs配置erlang开发环境(.emacs 文件)
以前都是用sublime写erlang代码,好处不多说,主要是觉得一点不好用,不能实现函数跳转,及其不方便,尤其是代码一多,头疼.后来折腾过IntelliJ,下了个收费$0.00的版本,风格还是挺稀饭 ...
- 《C语言深度剖析》学习笔记----C语言中的符号
本节主要讲C语言中的各种符号,包括注释符.单引号双信号以及逻辑运算符等. 一.注释符 注释符号和注释在程序的预编译期就已经被解决了,在预编译期间,编译器会将注释符号和注释符号之间的部分简单的替换成为空 ...
- StudentSchema student实例数据库环境搭建
环境搭建 查看默认表空间和临时表空间 select tablespace_name from dba_tablespaces: 创建用户 并给用户设置默认表空间和临时表空间 SQL> creat ...
- Linux学习之十三、快捷键与通配符、数据流重导向
通配符与特殊符号 接下来让我们利用通配符来玩些东西吧!首先,利用通配符配合 ls 找檔名看看: [root@www ~]# LANG=C <==由于与编码有关,先配置语 ...
- wx.BookCtrlBase
wx.BookCtrlBase A book control is a convenient way of displaying multiple pages of information, disp ...
- Effective C++ 条款18
让接口easy被正确使用,不easy被误用 如题目,我们自己的程序接口是面向用户的,程序的目的不可是解决这个问题,并且要让用户easy使用.所以.必须保证我们的程序接口具有非常强的鲁棒性. 怎么保证接 ...
- Ubuntu Code::Blocks IDE 13.12 汉化
Ubuntu Code::Blocks IDE 13.12 汉化: 安装很简单,不再赘述. 单说汉化: .下载中文简体汉化包(百度网盘):链接: http://pan.baidu.com/s/1kU3 ...