博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode Notes_#5 Longest Palindromic Substring
阅读量:7019 次
发布时间:2019-06-28

本文共 3927 字,大约阅读时间需要 13 分钟。

LeetCode Notes_#5 Longest Palindromic Substring

Contents

题目

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"

思路和解答

思路

  • 有点像之前的#9 Palindrome Number,又有点像昨天写的#3 Longest Substring Without Repeating Characters
  • 于是我的第一想法还是暴力循环...先写一个判断回文字符串的函数,然后用这个函数找出所有的回文字符串,找到最长的
    • 从每个字符串开始的所有回文串
  • 是否可以借鉴#3里边的写法呢?
    • 用一个滑动窗口来遍历
      • 其实就是左右两个指针,需要如何控制才能保证不漏掉任何一种回文串?
        • 感觉对于回文串这种,不太好从前往后一遍就检查到...
        • 难点在于:例如abbaabba
        • 有一个想法:不是从每个字符后面开始遍历,而是从每个字符的两边开始遍历,以这个字符为中心,两边的指针不断扩大,直到得到以这个字符为中心的最大的回文串,如果比最长回文串还长,就成为新的最长回文串,否则就不管。这个还需要区分奇偶,有可能是以两个字符串为中心
      • 得到一个回文串之后,可左右同时扩展,然后检验是否是回文串
    • 用字典存储关键信息
      • #3的重点在于判断是否有重复
      • 这题重点在于判断回文字符串,一旦发现就加入字典,然后以长度作为索引?
        • 这里不需要,因为我没有'查询'的需求,我只需要维护一个max变量,不断地更新,就不需要把所有找到的回文字符串都存下来
      • #9里边的对称规律是否能应用过来呢?
        • 可以用于判断回文数的函数
s='aba'reverse=''for k in range(len(s)):       reverse=reverse+s[len(s)-1-k]if reverse==s:    print (True)else:    print (False)
True
s[0:3]#如果要通过切片的方式访问到字符串s最后一个字符,那么上限应该是len(s)
'aba'
s[0:4]#如果上限超过len(s),返回结果也是截止到最后一个字符
'aba'
#错误尝试,超时了class Solution(object):    def longestPalindrome(self, s):        """        :type s: str        :rtype: str        """        if len(s)<=1:            return s        else:            maxPalindrome=''            for i in range(len(s)):                for j in range(i+1,len(s)+1):#range上限是len(s)+1,只能取到len(s)                    tmpString=s[i:j]                    if self.isPalindrome(tmpString) and len(tmpString)>len(maxPalindrome):                        maxPalindrome=tmpString            return maxPalindrome                                                def isPalindrome(self,tmpS):        reverse=''        for k in range(len(tmpS)):            reverse=reverse+tmpS[len(tmpS)-1-k]        if reverse==tmpS:            return True        else:            return False
type(min(1,2))
int
#再一次尝试,有些testcase通不过,感觉还是索引的问题,字符串的索引真的很麻烦那class Solution(object):    def longestPalindrome(self, s):        """        :type s: str        :rtype: str        """        if len(s)<=1:            return s        if len(s)==2 and s[0]!=s[1]:            return s[0]        elif len(s)==2 and s[0]==s[1]:            return s        else:            maxPalindrome=''            for i in range(0,len(s)-1):                maxHalfLen=int(min(i,len(s)-i-1))                tmpStringOdd=s[i-maxHalfLen:i+maxHalfLen]                tmpStringEven=s[i-maxHalfLen:i+maxHalfLen+1]                if self.isPalindrome(tmpStringOdd) and len(tmpStringOdd)>len(maxPalindrome):                    maxPalindrome=tmpStringOdd                if self.isPalindrome(tmpStringEven) and len(tmpStringEven)>len(maxPalindrome):                    maxPalindrome=tmpStringEven                if s[i]==s[i+1] and len(maxPalindrome)<2:                    maxPalindorme=s[i:i+2]                            return maxPalindrome                                    def isPalindrome(self,tmpS):        reverse=''        for k in range(len(tmpS)):            reverse=reverse+tmpS[len(tmpS)-1-k]        if reverse==tmpS:            return True        else:            return False

解答

def longestPalindrome(self, s):    res = ""    for i in xrange(len(s)):        # odd case, like "aba"        tmp = self.helper(s, i, i)        if len(tmp) > len(res):            res = tmp        # even case, like "abba"        tmp = self.helper(s, i, i+1)        if len(tmp) > len(res):            res = tmp    return res # get the longest palindrome, l, r are the middle indexes   # from inner to outerdef helper(self, s, l, r):    while l >= 0 and r < len(s) and s[l] == s[r]:        l -= 1; r += 1    return s[l+1:r]

936ms,beat 53.63%

这段代码写的很好

  • 跟我想法很像,从中间往两边遍历的这种,其实就是索引的问题,其他想法都类似,实在是不想继续调了...感觉他写的非常易懂,我这个就写的自己都会绕进去....
  • 另一个优点在于他没有每次得到一个字符串就循环一遍,验证是否是回文,而是不断地看两端的新延伸出来的字符是不是相同
  • 辅助函数的参数设计:他使用l,f的参数来代表两个指针,并且通过修改初始化参数,可以适应奇偶两种情况

转载于:https://www.cnblogs.com/Howfars/p/9851466.html

你可能感兴趣的文章
进入移动互联C2B时代
查看>>
C语言中的地址传递(传指针,传递给形参的指针仍然是实参指针的一份拷贝)
查看>>
http常见状态码
查看>>
(贪心)School Marks -- codefor -- 540B
查看>>
redis优缺点
查看>>
Sublime text 3 SVN插件及使用方法
查看>>
Jquery EasyUI datagrid 的一些问题
查看>>
nginx代理缓存
查看>>
计算器小练习
查看>>
SeekArc
查看>>
rem和em和px vh vw和% 移动端长度单位
查看>>
Ubuntu关机与重启的相关指令
查看>>
struct和union和enum声明的语法
查看>>
php中foreach使用引用的陷阱
查看>>
[CC-BSTRLCP]Count Binary Strings
查看>>
[NOIp2018提高组]旅行
查看>>
陶哲轩实分析习题8.3.4
查看>>
Analysis by Its History Exercise 2.3
查看>>
键盘各种按键对应的ASII码
查看>>
[转载]SharePoint 2013测试环境安装配置指南
查看>>