关于字符串的问题,无论是回文子串,还是说最大不重复子串,或者其他类型的子串,对于这种关于子串的问题一直都比较头疼,尤其是今天碰到的这个题目,感觉想了真的很久,尤其是对于python中的字符切片问题,总是考虑到index的范围问题,就很是苦恼。
闲话少说,先来看题目:
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
给定一个字符串,找出最长的回文子串
Example 1:
Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.
Example 2:
Input: "cbbd"
Output: "bb"
示例也很容易明白,接下来就说下我的思路:
我的思路很简单,也沿用了一直以来的第一直觉方法来做这道题,完全没有考虑时间性能(等第二遍刷题的时候再研究具体的细节),首先我先得到字符串的长度,比如一个字符串‘yuantian’它的长度是8,接下来我要使用遍历操作来进行逐个遍历,由于字符串它的子串的组合特别多,本道题是连续子串,因此对于一个长度为n的字符串,其连续子串的个数有1+2+3+...+n=n(n+1)/2个。
接下来我对于每一个长度的子串分别遍历,比如当子串长度为1时,就再求出它的迭代次数,拿字符串'yuantian'来说,当考虑字符串为1的情况时,有8次迭代,分别为'y','u','a','n','t','i','a','n',当字符串长度为2时,有7次迭代,分别为'yu','ua','an','nt','ti','ia','an'以此类推,当子串长度为8时,迭代次数为1,是'yuantian'所以,接下来就对各种情况迭代进行判断是否是回文串。
判断是否是回文串,就是将这个子串逆置然后输出,看是不是一样的,因此这里遇到了我第一个坑:
python中创建一个字符串变量s,当全部逆置输出就可以,但是切片输出,就不行,因此这里我踩了坑,特地说出来(宝宝心里苦,一直都没看清楚):
因此我在代码中将切片赋值给新的变量,这样就不会出现部分子串的情况下不能逆置输出的情况了!
接下来就是我的第二个坑,因为要输出最长的回文子串,那就既需要得到最长的回文子串长度,也需要得到相对应的子串,所以我使用了字典的数据结构,一方面是保存满足条件的“子串长度:子串” 键值对,另一方面就是为了最后的输出检索。
我的核心以及测试代码如下:
#Author:Tian Yuan
#Date:2019/3/22
import math
class Solution:
def longestPalindrome(self, s: str) -> str:
# print(s)
num = {}
if s == '':
return 0
elif len(s)==1:
return 1
else:
for i in range(1,len(s)+1):
length = i
iter_num = len(s)+1-i
for m in range(iter_num):
a = s[m:m+length]
# print(a)
# print(a[::-1])
if a == a[::-1]:
# print(s[m:m+length] == s[m:m+length:-1])
# print(s[m:m+length])
# print(a)
num[length]=a
# print('success')
# print(num)
# print(num)
print(num[max(num)])
if __name__ == '__main__':
Solution().longestPalindrome('yuananab')
另外补充一个自己的小知识误区,字符串的下标切片索引可以出现下标等于字符串长度的情况,比如:
之前我一直认为下标切片只能写到7,因为索引是0-7(惭愧啊!)
最后提交成功!
开心!
速度问题,嗯,后面再说。哈哈!