您的位置:首页 > 其它

【leetcode每日一题】【2019-04-16】5.最长回文子串

2019-04-16 10:14 302 查看

5. 最长回文子串

地址: https://leetcode-cn.com/problems/longest-palindromic-substring/submissions/

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:

输入: "cbbd"
输出: "bb"

首先确认下什么叫做 回文子串
"回文串"是一个正读和反读都一样的字符串,比如"level"或者"noon"等等就是回文串。

先说下思路
最暴力的方法:
穷举所有的字符串,然后判断字符串是不是回文串

优化1:
因为回文串的第一个字符和最后一个字符肯定一样,所以不用穷举,而是判断 第一个字符到下一个和第一个字符一样的字符之前的字符串是否为回文串
比如: abc… ,判断 a 到 下一个a 之间的字符串,然后再判断 a 到 下下一个a之间的字符串, 直到找不到a,然后再判断第二个字符串 b

优化2:
从第2个字符开始遍历,找以这个字符为中心是否有最大的回文串

伪代码:
最大回文串

for 2 in 字符串长度:
for i in 1 到 字符串长度/2向上取整:
if n-i>=0 and n+i-1<=字符串长度-1:
if 字符串[n-i:n+i-1]是回文串 and 长度大于 最大回文串长度:
最大回文串=字符串[n-i:n+i-1]
if n-i>=0 and n+i<=字符串长度-1:
if 字符串[n-i:n+i]是回文串
最大回文串=字符串[n-i:n+i-1]

Python代码地址:

class Solution:
def longestPalindrome(self, s: str) -> str:
max_s=s[0:1]
for i in range(1,len(s)):
for j in range(1,(len(s)+1)//2+1):
if i-j>=0 and i+j-1<=len(s)-1:
if s[i-j:i+j]==s[i-j:i+j][::-1] and len(s[i-j:i+j])>len(max_s):
max_s=s[i-j:i+j]
if i-j>=0 and i+j<=len(s)-1:
if s[i-j:i+j+1]==s[i-j:i+j+1][::-1] and len(s[i-j:i+j+1])>len(max_s):
max_s=s[i-j:i+j+1]
return max_s

代码一直显示超时,再次优化下,从中心点来往外扩展判断是否为回文串。
代码如下:

class Solution:
def longestPalindrome(self, s: str) -> str:
max_s=s[0:1]
for i in range(1,len(s)):
for j in range(1,(len(s)+1)//2+1):
if i-j>=0 and i+j-1<=len(s)-1 and s[i-j]==s[i+j-1] :
if len(s[i-j:i+j])>len(max_s):
max_s=s[i-j:i+j]
else:
break
for j in range(1,(len(s)+1)//2+1):
if i-j>=0 and i+j<=len(s)-1 and s[i-j]==s[i+j] :
if len(s[i-j:i+j+1])>len(max_s):
max_s=s[i-j:i+j+1]
else:
break;
return max_s

终于通过了:
显示详情
执行用时 : 3276 ms, 在Longest Palindromic Substring的Python3提交中击败了37.81% 的用户
内存消耗 : 13.3 MB, 在Longest Palindromic Substring的Python3提交中击败了37.03% 的用户

Scala代码:

object Solution {
def longestPalindrome(s: String): String = {
var max_s:String=s(0).toString()
var i=1

for ( i <- 1 to s.length ){
var flag = true
for ( j <- 1 to (s.length+1)/2+1 if flag ){
if ( i-j>=0 && (i+j-1)<=s.length-1 && s(i-j)==s(i+j-1) ) {
if (s.substring(i-j,i+j).length>max_s.length){
max_s=s.substring(i-j,i+j)
}
}else{
flag = false
}
}
flag = true
for ( j <- 1 to (s.length+1)/2+1 if flag  ){
if ( i-j>=0 && (i+j)<=s.length-1 && s(i-j)==s(i+j) ) {
if (s.substring(i-j,i+j+1).length>max_s.length){
max_s=s.substring(i-j,i+j+1)
}
}else{
flag = false
}
}
}
return max_s
}
}

提交总是失败,实在找不出原因了

注意点

  1. Scala中退出循环的3种方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: