一、前言
让人成长的不是岁月,而是经历。
每天五分钟,看懂一道简单、中等难度的算法题,尽可能将复杂的题讲清楚。
疯狂学习python中,2020-06-02更新
二、题目
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd”
输出: “bb”
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
三、循环暴力解法
3.1 循思路
对于一个子串而言,如果它是回文串,并且长度大于 2,那么它去掉首尾字符依然是个回文字符串。按照这样的思路,我们就可以循环去掉首位字符的方法来进行比较。
判断回文字符串的条件为:
s
t
r
=
=
s
t
r
[
:
:
−
1
]
str ==str[::-1]
str==str[::−1]
暴力循环解题思路比较简单,方便大家拓展解题思路,时间复杂度为:O(n2)
3.2 代码实例
longS = len(s)
for i in range(longS):
for j in range(i + 1):
temp = s[j:longS - (i - j)]
if temp == temp[::-1]:
return temp
else:
return ""
四、暴力破解优化
4.1 解法思路
- 首先判断一个字符串是否为回文字符串,用到公式为:
s t r 1 = = s t r 1 [ : : − 1 ] str1==str1[::-1] str1==str1[::−1]
同时一个重要的前提就是,如果一个字符串是回文字符串,那么它子字符串也应该为回文字符串。
例子:
s
t
r
=
"
a
b
b
c
b
b
a
"
str="abbcbba"
str="abbcbba"
那么其子字符串str1[1:-1],也应该为回文。
我们的思路是:先遍历一遍字符串字母及下标,设置一个start为子字符串的开端,如果判断候选字符串比已知最长回文字符串长1或者2时,则向前移动1或者2位。
4.2 代码实例
class Solution:
def longestPalindrome(self, s: str) -> str:
res = '' # 候选字符串
for i in range(0, len(s)):
start = max(0, i - len(res) - 1) # 指针
temp = s[start: i + 1]
if temp == temp[::-1]:
res = temp
else:
temp = temp[1:]
if temp == temp[::-1]:
res = temp
return res
if __name__ == '__main__':
str1 = "cabkkbd"
obj = Solution()
print(obj.longestPalindrome(str1))