携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第29天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目解析
1 <= s.length <= 1000s仅由数字和英文字母组成
二、思路分析:
我们拿到本题,读取本题内容要求在指定字符串中找出最长回文子串,在解答题目之前我们需要明确几点:
- 子串:是在原字符串的一段连续字集
- 子序列:是在原字符串的子集
- 回文子串:左右字符串相等。例如“abcba”
如何求出最长的回文子串,可以使用暴力求解、中心扩展算法方法,思路如下:
-
方法一:暴力求解:
- 定义res变量来存储回文子串,初始化""
- start是回文子串的起始位置,位置坐标计算位置取i-len(res)-1,0的最大值
- 使用临时变量tmp来取字符串s之间start与i+1
- 当tmp子串与tmp[::-1]相等时,默认是回文子串,并将res子串更新
- 当tmp更新tmp[1:],当tmp与tmp[::-1]时,则将res子串更新
class Solution(object): def longestPalindrome(self, s): """ :type s: str :rtype: str """ res = "" for i in range(len(s)): start = max(i-len(res)-1,0) tmp = s[start:i+1] if tmp == tmp[::-1]: res = tmp else: tmp = tmp[1:] if tmp == tmp[::-1]: res = tmp return res -
方法二: 中心扩散算法
- 定义一个回文字符串函数根据指定的left >=0,right < len(s)-1,s[left]==s[right],并返回回文子串的长度right-left-1
- 回文字符串长度有奇数和偶数长,奇数长度的回文字符串中心位置i,偶数长度的中心位置i,i+1
- 调用函数分别求出奇数长度和偶数长度,Len取最大值
- 回文字符串中start位置则i-(Len-1)/2
- 回文字符串中end位置则为i+Len/2
- 直到遍历完字符串s,返回s[start:end+1]
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
def centerAccount(left,right):
while left >= 0 and right < len(s) and s[left] == s[right]:
left -=1
right +=1
return right-left-1
start,end = 0,0
for i in range(len(s)):
evenum = centerAccount(i,i+1)
ordnum = centerAccount(i,i)
Len = max(evenum,ordnum)
if Len > end - start:
start = i - (Len-1) / 2
end = i + Len / 2
return s[start:end+1]
三、总结:
本题考察在字符串中找到最长回文子串,此题有四种解法暴力求解、中心扩展算法、马拉车算法和动态规化,作为小白目前只掌握前面两种,后续继续跟上,AC 提交代码记录:
- 时间复杂度:O(n^2),其中 n 是字符串的长度。长度为 1 和 2 的回文中心分别有 n 和 n−1 个,每个回文中心最多会向外扩展 O(n) 次
- 空间复杂度:O(1),只需要额外的常数级别的空间
以上是本期内容,欢迎大佬们点赞评论,下期见~~~