Leetcode(5)最长回文子串
Leetcode(4)寻找两个有序数组的中位数
[题目表述]:
给定一个字符串 s,找到 s 中 最长 的回文子串。你可以假设 s 的最大长度为 1000。‘
第一种方法:未完成;利用回文子串的特点
一开始我的思路如下:回文子串的特点是首尾字母相同,所以我对每一个字母都找到位于它后面的相同字母,利用切片判断这一段是否为回文子串(str[i:j]==str[i:j][::-1]).时间复杂度很高,主要是因为str.find操作非常耗时.
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
res=""
res+=s[0]
res_star=0
res_end=0
Maxsize=1
for i in range(len(s)):
nPos=i
i_number=s[i:].count(s[i])
if i_number==1:
continue
while i_number!=1:
if s[i+1]==s[i]:
i_number=i_number-1
nPos=i+1
if Maxsize!=max(Maxsize,len(s[i:nPos+1])):
Maxsize=len(s[i:nPos+1])
res_star,res_end=i,nPos+1
res+=s[i:nPos+1]
else:
nPos=s[nPos+1:].index(s[i])
i_number=i_number-1
if s[i:nPos+1]==s[i:nPos+1:-1]:
if Maxsize!=max(Maxsize,len(s[i:nPos+1])):
res_star,res_end=i,nPos+1
res+=s[i:nPos+1]
return res[res_star:res_end+1]
学习
str.find /str.index
切片 回文子串
第二种方法:动态规划
执行用时:3828 ms; 内存消耗:11.7MB 效果:有点差 O(n2)
class Solution:
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
max = 0
palindromic = '' if len(s) == 0 else s[0]
for i in range(len(s)):
length = 1
while i - length >=0 and i + length < len(s) and s[i-length] == s[i+length]:
tmp = s[i-length:i+length+1] ##奇回文
if len(tmp) > max:
max = len(tmp)
palindromic = tmp
length += 1
length = 1
while i - length + 1 >=0 and i + length < len(s) and s[i-length+1] == s[i+length]:
tmp = s[i-length+1:i+length+1] ##偶回文
if len(tmp) > max:
max = len(tmp)
palindromic = tmp
length += 1
return palindromic
学习
动态规划的思想是首先判断相邻的字符串是否是回文,然后继续判断连续的三个字符是否是回文,然后是四个,…,直到判断完整个字符串 ——对子串的判断;状态转换
动态规划思想
奇偶回文
第三种方法:Manacher马拉车法:添加辅助标志
执行用时:80 ms; 内存消耗:12MB 效果:非常好 O(n)
class Solution:
#Manacher algorithm
#http://en.wikipedia.org/wiki/Longest_palindromic_substring
def longestPalindrome(self, s):
# Transform S into T.
# For example, S = "abba", T = "^#a#b#b#a#$".
# ^ and $ signs are sentinels appended to each end to avoid bounds checking
T = '#'.join('^{}$'.format(s))
n = len(T)
P = [0] * n
C = R = 0
for i in range (1, n-1): ##首尾是终止符
P[i] = (R > i) and min(R - i, P[2*C - i]) # equals to i' = C - (i-C) #如果R>i且R-i大,则P[i]=P[j]
# Attempt to expand palindrome centered at i 两者相等,因为R范围内对称
while T[i + 1 + P[i]] == T[i - 1 - P[i]]:
P[i] += 1
# If palindrome centered at i expand past R,
# adjust center based on expanded palindrome.
if i + P[i] > R: #最终求出P[i]后设立新C,R C=center R=range 利用2*C-i拉着i走一样
C, R = i, i + P[i]
# Find the maximum element in P.
maxLen, centerIndex = max((n, i) for i, n in enumerate(P))
return s[(centerIndex - maxLen)//2: (centerIndex + maxLen)//2] #因为len(P)=len(s)两倍多
学习:
两头需要边界符
字符.join
马拉车算法思想
list.enumerate()
第四种方法:新增字母判断是否仍是回文
执行用时:72 ms; 内存消耗:11.8MB 效果:非常好 O(n) 由于使用切片,所以比马拉车快
class Solution:
# @return a string
def longestPalindrome(self, s):
if len(s)==0:
return s
maxLen=1
start=0
for i in xrange(len(s)):
if i-maxLen >=1 and s[i-maxLen-1:i+1]==s[i-maxLen-1:i+1][::-1]:
start=i-maxLen-1
maxLen+=2
continue
if i-maxLen >=0 and s[i-maxLen:i+1]==s[i-maxLen:i+1][::-1]:
start=i-maxLen
maxLen+=1
return s[start:start+maxLen]
学习
思路是:遍历,第i个字母加上后面一个字母,看i-Max-1到i+1(就是从第i个往后面看)是不是回文,如果是,则回文串起点跟Max被记录下来;如果这样不是,那就看i-Max到i+1是不是回文,如果是也是一样的操作。
因为前面字符串加上新的字符是回文的话,就只有两种可能性,
①:bb+b这种 ②:a bb+a这种,①记录下Max=2,
②则在a前面Max+1找,即是i-Max-1,然后记录下Max=3,
做切片的时候就是start:start+Max,Max自动会-1的,保证半径符合。
Leetcode(5)最长回文子串的更多相关文章
- LeetCode:最长回文子串【5】
LeetCode:最长回文子串[5] 题目描述 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: ...
- 【LeetCode】最长回文子串【动态规划或中心扩展】
给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad"输出: "bab"注意: " ...
- Java实现 LeetCode 5 最长回文子串
5. 最长回文子串 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab&quo ...
- [LeetCode] 5. 最长回文子串 ☆☆☆(最长子串、动态规划)
最长回文子串 (动态规划法.中心扩展算法) https://leetcode-cn.com/problems/longest-palindromic-substring/solution/xiang- ...
- 【LeetCode】最长回文子串-中心扩展法
[问题]给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 : 输入: "babad" 输出: "bab" 注意: ...
- leetcode python最长回文子串
回文的意思是正着念和倒着念一样,如:上海自来水来自海上,雾锁山头山锁雾,天连水尾水连天 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: & ...
- [LeetCode] 5. 最长回文子串
题目链接:https://leetcode-cn.com/problems/longest-palindromic-substring/ 题目描述: 给定一个字符串 s,找到 s 中最长的回文子串.你 ...
- LeetCode 05 最长回文子串
题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" 注意: ...
- 【LeetCode】最长回文子串-动态规划法
[问题]给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 : 输入: "babad" 输出: "bab" 注意: ...
- [leetCode]5. 最长回文子串(DP)
题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 题解 dp.先初始化长度为1和长度为2的串.再依次算长度为3,4,5.... 当找到回文串时,若长度比当 ...
随机推荐
- Java基础之final、static关键字
一.前言 关于这两个关键字,应该是在开发工作中比较常见的,使用频率上来说也比较高.接口中.常量.静态方法等等.但是,使用频繁却不代表一定是能够清晰明白的了解,能说出个子丑演卯来.下面,对这两个关键字的 ...
- JSP自定义标签的使用简化版
在jsp中 如果不想页面中出现java代码 这个时候就需要使用到jsp的自定义标签库技术了 自定义标签库 能够有效的减少jsp中java代码的出现 使其更加自然的像html页面一样 如果要使用jsp自 ...
- JavaSE知识点总结(一)
第一章 课程介绍第二章 java语言概述 课时2:作业 1.常用软件分为那两类? 系统软件 应用软件 2.人机交互的两种方式是哪两种? 图形化界面 代码行命令 课时3:作业 1.java语言的特性有哪 ...
- 由"跨域"引出的一个终极思想(jsonp)
1.什么是跨域? 当协议.子域名.主域名.端口号中任意一个不相同时,都算作不同域. 跨域并不是请求发不出去,请求能发出去,服务端能收到请求并正常返回结果,但是因为浏览器存在一个"同源策略&q ...
- Scrapy项目 - 实现斗鱼直播网站信息爬取的爬虫设计
要求编写的程序可爬取斗鱼直播网站上的直播信息,如:房间数,直播类别和人气等.熟悉掌握基本的网页和url分析,同时能灵活使用Xmind工具对Python爬虫程序(网络爬虫)流程图进行分析. 一.项目 ...
- php echo/print 输出函数比较
一.两者区别 echo 支持多个字符串输出,用逗号(,)隔开,print只支持一个字符串输出 echo 输出速度比print快 echo 没有返回值,print返回值总是1 二.使用 echo e ...
- Flume 知识点(六)Flume 的监控
简述 使用 Flume 实时收集日志的过程中,尽管有事务机制保证数据不丢失,但仍然需要时刻关注 Source.Channel.Sink 之间的消息传输是否正常. 比如,SouceChannel 传输了 ...
- HTML基础知识(块级标签,行内标签,行内块标签)
块级元素:独占一行,对宽高的属性值生效:如果不给宽度,块级元素就默认为浏览器的宽度,即就是100%宽: 行内元素:可以多个标签存在一行,对宽高属性值不生效,完全靠内容撑开宽高! 其中还有一种结合两种模 ...
- 基于 H5 WebGL 的 3D 室内定位及电子围栏
前言 现代工业化的推进在极大加速现代化进程的同时也带来的相应的安全隐患,在传统的可视化监控领域,一般都是基于 Web SCADA 的前端技术来实现 2D 可视化监控,本系统采用 Hightopo 的 ...
- python编程基础之十九
字符串判断常用函数: str.isalpha() # 判断是否是全字母 str.isdigit() # 判断是否是全数字 str.isalnum() # 判断是否是字母和数字组合 str.is ...