题目描述:
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
Example:
Input: "babad" Output: "bab" Note: "aba" is also a valid answer.
Example:
Input: "cbbd" Output: "bb"
我的答案:
def longestPalindrome(s):
"""
这个解法超时了...暂时没有想到优化的办法
"""
maxLength = 0
start = end = 0
for i in range(len(s)):
for j in range(i + 1, len(s) + 1):
if s[i:j] == s[i:j][::-1]:
if (j - i) > maxLength:
start = i
end = j
maxLength = j - i
return s[start:end]
基本思路就是两层的循环,依次比较每一个切片和对应翻转是否相等,相等则更新maxLength的值。
答案是对的,但是超时了,在处理比较长的字符串时,O(n2)的复杂度还是有点高了。
Discuss中O(n)复杂度的方法:
Discuss中O(n)复杂度的方法:
def longestPalindrome(s):
if len(s) == 0:
return 0
maxLen = 1
start = 0
for i in range(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]
大体思路就是不用循环两次,用一个start来标记回文开始索引,再用maxLength标记最大长度,对字符串切片可得到结果。
学到:
一个字符串子串的翻转可以用下面代码实现:
s[i - maxLen - 1:i + 1][::-1]
还有O(n)复杂度的DP思想值得学习一下...一直不是很懂,能够很大程度上降低算法的复杂度。