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)最长回文子串的更多相关文章

  1. LeetCode:最长回文子串【5】

    LeetCode:最长回文子串[5] 题目描述 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: ...

  2. 【LeetCode】最长回文子串【动态规划或中心扩展】

    给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad"输出: "bab"注意: " ...

  3. Java实现 LeetCode 5 最长回文子串

    5. 最长回文子串 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab&quo ...

  4. [LeetCode] 5. 最长回文子串 ☆☆☆(最长子串、动态规划)

    最长回文子串 (动态规划法.中心扩展算法) https://leetcode-cn.com/problems/longest-palindromic-substring/solution/xiang- ...

  5. 【LeetCode】最长回文子串-中心扩展法

    [问题]给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 : 输入: "babad" 输出: "bab" 注意: ...

  6. leetcode python最长回文子串

    回文的意思是正着念和倒着念一样,如:上海自来水来自海上,雾锁山头山锁雾,天连水尾水连天 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: & ...

  7. [LeetCode] 5. 最长回文子串

    题目链接:https://leetcode-cn.com/problems/longest-palindromic-substring/ 题目描述: 给定一个字符串 s,找到 s 中最长的回文子串.你 ...

  8. LeetCode 05 最长回文子串

    题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" 注意: ...

  9. 【LeetCode】最长回文子串-动态规划法

    [问题]给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 : 输入: "babad" 输出: "bab" 注意: ...

  10. [leetCode]5. 最长回文子串(DP)

    题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 题解 dp.先初始化长度为1和长度为2的串.再依次算长度为3,4,5.... 当找到回文串时,若长度比当 ...

随机推荐

  1. Java程序语言的后门-反射机制

    在文章JAVA设计模式-动态代理(Proxy)示例及说明和JAVA设计模式-动态代理(Proxy)源码分析都提到了反射这个概念. // 通过反射机制,通知力宏做事情 method.invoke(obj ...

  2. C# https证书通信Post/Get(解决做ssl通道时遇到“请求被中止: 未能创建 SSL/TLS 安全通道”问题)

    public static string HttpPost(string url, string param = null) { HttpWebRequest request; //如果是发送HTTP ...

  3. APP稳定性测试

    APP稳定性测试-monkey测试     第一篇-App稳定性测试-Monkey(基本操作) 准备工作 1.首先下载好adb工具 2.使用数据线连接电脑,打开usb调试 3.使用win+R打开运行, ...

  4. 生产环境轻量级dns服务器dnsmasq搭建文档

    dnsmasq搭建文档 一.生产环境域名解析问题 之前生产环境设备较少,是通过维护master(192.168.1.1)设备的hosts文件实现的.每次新增设备后,需要在master的hosts文件中 ...

  5. java Mail如何发送邮件

    1.应用场景:在系统需要发送与用户相关的消息时,而用户不在线,可以采取发送邮件的方式,使用户了解最新的系统情况 或者发送验证码等验证场景 2.实验环境 主要使用mail.jar和activation. ...

  6. Salem and Sticks-萨鲁曼的棍子 CodeForce#1105A 暴力

    题目链接:Salem and Sticks 题目原文 Salem gave you 

  7. 制定一个学习liunx的目标

        制定一个学习liunx的目标       学习目标方法 1.在这五个月的学习时间里,制定一套自己的学习方式. 2.养成做笔记以及写博客的习惯 . 3.坚持上课前预习,自习时间总结 . 4.紧跟 ...

  8. js初学总结

    基础 交换变量方式 //利用第三方变量进行交换 var num1 = 10; var num2 = 20; var temp; temp = num1; num1 = num2; num2 = tem ...

  9. c++中不需要显示指出struct

    赫  21:48:16请教个问题赫  21:49:53类声明前对私有继承的结构,的struct定义是什么作用?类声明前对该类私有继承的结构,的struct定义是什么作用?赫  21:51:21stru ...

  10. 阿里云服务器CentOS6.9 tomcat配置域名访问

    之前一直是ip访问项目,今天申请到一个测试域名,想要用设置用域名访问项目. 1.进入阿里云服务器中,修改tomcat中server.xml文件 cd /usr/local/apache-tomcat/ ...