leetcode题目之最长回文子串

关于字符串的问题,无论是回文子串,还是说最大不重复子串,或者其他类型的子串,对于这种关于子串的问题一直都比较头疼,尤其是今天碰到的这个题目,感觉想了真的很久,尤其是对于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,当全部逆置输出就可以,但是切片输出,就不行,因此这里我踩了坑,特地说出来(宝宝心里苦,一直都没看清楚):

leetcode题目之最长回文子串_第1张图片

因此我在代码中将切片赋值给新的变量,这样就不会出现部分子串的情况下不能逆置输出的情况了!

接下来就是我的第二个坑,因为要输出最长的回文子串,那就既需要得到最长的回文子串长度,也需要得到相对应的子串,所以我使用了字典的数据结构,一方面是保存满足条件的“子串长度:子串” 键值对,另一方面就是为了最后的输出检索。

 

我的核心以及测试代码如下:

#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(惭愧啊!)

最后提交成功!

开心!

leetcode题目之最长回文子串_第2张图片

速度问题,嗯,后面再说。哈哈!

 

你可能感兴趣的:(Progra)