LeetCode05最长回文子串

题目描述:

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。

示例 1:

输入: "babad"
输出: "bab"
注意: "aba"也是一个有效答案。

示例 2:

输入: "cbbd"
输出: "bb"
感悟:
  1. 一定要审好题。。。一开始想当然的认为自己理解了什么是回文子串。其实理解错误,然后再重头开始做,浪费时间。所以,一定要明白自己在做什么。
  2. 要灵活,想问题要灵活,换个角度来思考一下,有没有更容易的解决办法,可以类比一下。关于算法问题,常用的几类解题方法更要稔熟于心。具体的多看别人总结的知识,学习别人的知识,总比自己瞎想要系统,要全面,当然如果自己不去思考,那也白看。(1) https://blog.csdn.net/int1282951082/article/details/52128991 (2) https://www.cnblogs.com/ganhang-acm/p/3860361.html
  3. 在LeetCode上面,有解答的问题,一定要看一下别人的解答。先自己思考怎么做,然后再看别人的解题思路。
解题思路:

一开始我的解题思路就是暴力做。

  1. 固定起始字符,选择首尾字符相同的最大字符串,然后判断其是不是回文串,如果是,与最大length比较,比之大的话,则更新最大length和相应的串结果result
  2. 上一步固定起始字符,获得的最大字符,如果不满足的话,则选择第二大的字符,继续判断。
  3. 然后再继续固定下一个字符,继续循环。

中间可以加入停止状态,当剩余串长度小于最大length的时候,就可以停止了。当然这个办法是非常耗时的,尤其是判断是否是回文字符串时。

额…. 就在刚才,写着写着,突然想起来,好像可以改进一下判断方法,结果,提交之后通过了。之前一直是超时状态。

原来判断是回文字符串的方法是:

def judge(str):
    mean = int((len(str) + 1) / 2)

    for i in range(mean):
        if str[i] != str[len(str) - 1 - i]:
            return False
    return True

其实,只要将字符串倒序一下,然后判断是否相同即可。。。唉

def judge2(str):

    s2 = str[::-1]
    if s2 == str:
        return True
    else:
        return False

另一种思路:

当然,这题可以从另外的角度来做。

比如说,先将字符串倒序,然后寻找两字符串最大公共子串。这个方法应该挺常用的。

寻找最大公共子串的主要思路就是用一个矩阵,将两个字符串分别作为行和列,简单画个图表示就是:

用矩阵记录字符串相等的情况,矩阵某位置的值 = 左上角 + 1(如果相同,否则为0)

在得到最大公共子串之后,则可以继续判断公共子串的起始位置,在原始的两字符串中是否一样,如果一样的话,则说明找到了回文串,如果不一样的话,需要再找第二大的公共子串,重复该过程。

代码实现:

GitHub地址:https://github.com/zhangdianlei/LeetCode_python/blob/master/src/c05.py

def judge(str):

    s2 = str[::-1]
    if s2 == str:
        return True
    else:
        return False


class Solution:

    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        result = ""
        if len(s) == 0:
            return result
        else:
            length = 0

            for index, item in enumerate(s):

                endIndex = s.rfind(item)

                while endIndex != -1:
                    tempStr = s[index:endIndex + 1]

                    if judge(tempStr):

                        if (endIndex - index + 1) > length:
                            length = endIndex - index + 1
                            result = s[index:endIndex + 1]

                            if length >= len(s) - index:
                                return result
                            break

                    endIndex = s.rfind(item, 0, endIndex)

                if endIndex == -1:
                    if length == 0:
                        result = item
                        length = 1

            return result
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,有三种方法可以解决LeetCode上的最长回文子串问题。 方法一是使用扩展中心法优化,即从左向右遍历字符串,找到连续相同字符组成的子串作为扩展中心,然后从该中心向左右扩展,找到最长的回文子串。这个方法的时间复杂度为O(n²)。\[1\] 方法二是直接循环字符串,判断子串是否是回文子串,然后得到最长回文子串。这个方法的时间复杂度为O(n³),效率较低。\[2\] 方法三是双层for循环遍历所有子串可能,然后再对比是否反向和正向是一样的。这个方法的时间复杂度也为O(n³),效率较低。\[3\] 综上所述,方法一是解决LeetCode最长回文子串问题的最优解法。 #### 引用[.reference_title] - *1* [LeetCode_5_最长回文子串](https://blog.csdn.net/qq_38975553/article/details/109222153)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Leetcode-最长回文子串](https://blog.csdn.net/duffon_ze/article/details/86691293)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [LeetCode 第5题:最长回文子串(Python3解法)](https://blog.csdn.net/weixin_43490422/article/details/126479629)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值