当前位置: 首页 > article >正文

[leetcode]5_最长回文子串

给你一个字符串 s,找到 s 中最长的 回文子串

示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"

提示:
1 <= s.length <= 1000
s 仅由数字和英文字母组成

解题思路:【双指针】

参考博文:[leetcode]647_回文子串-CSDN博客


class Solution:

    def extend(self, s, left, right, length):  # 输出每个回文字符串、和对应长度
        sub_len = 0
        while left >= 0 and right < length and s[left] == s[right]:
            sub_len = right - left + 1  # 此时符合回文条件的子字符串长度
            left -= 1
            right += 1
        return s[left + 1: right], sub_len  # left - 1和right + 1操作后,才跳出循环,故截取字符串时,需要[left+1:right]
    def judge_sub_palindrome_index(self,s):
        length = len(s)
        max_sub_len = 0
        max_sub_str = ''
        for i in range(length):
            sub_1, len_1 = self.extend(s, i, i, length)  # 以i 单个字符扩展
            sub_2, len_2 = self.extend(s, i, i + 1, length)  # 以i , i+1两个字符扩展
            if len_2 > max_sub_len:
                max_sub_len = len_2
                max_sub_str = sub_2
            elif len_1 > max_sub_len:
                max_sub_len = len_1
                max_sub_str = sub_1
        return max_sub_str, max_sub_len

if __name__ == '__main__':
    s = input()
    result_s, result_l = Solution().judge_sub_palindrome_index(s)
    print(result_s)

其他思路:【动态规划】

参考博文:[leetcode]647_回文子串-CSDN博客


    def judge_sub_palindrome_dp(self, s):
        sub_start = 0
        sub_end = 0
        sub_len = 0
        length = len(s)

        dp = [[False] * length for _ in range(length)]
        for i in range(length - 1, -1, -1):
            for j in range(i, length):
                if s[i] == s[j]:
                    if j - i <= 1:
                        dp[i][j] = True
                    elif dp[i + 1][j - 1]:
                        dp[i][j] = True
                if dp[i][j] and j - i + 1 > sub_len:
                    sub_len = j - i + 1
                    sub_start = i
                    sub_end = j
        return s[sub_start:sub_end + 1], sub_len

其他思路:【暴力思路】

从大到小控制子串长度

然后将每个子串逆序对比

    def judge_sub_palindromic_str(slef, s):
        # 长度递减,for用于遍历字符串长度中的数字3,2,1,0;从大到小控制回文长度,所以返回的第一个回文必是最长回文子串
        for i in range(len(s), 0, -1):
            # 分别控制不同长度回文的位置
            for j in range(0, len(s) - i + 1):
                # 回文判断
                if s[j: j + i] == s[j: j + i][::-1]:
                    return s[j: j + i], i

其他思路:【暴力思路】

从小到大控制子串长度

判断子串是否回文串

    def judge_sub_palindromic_str_I(self, s):
        lenth = len(s)
        max_sub_length = 0
        max_sub_s = ''
        for i in range(lenth):
            for j in range(i + 1, lenth):
                slice_s = slice(i, j)
                sub_s = s[slice_s]
                sub_length = len(s[slice_s])
                # 循环判断字串是否为回文串
                if sub_s[:] == sub_s[::-1] and sub_length > max_sub_length:
                    max_sub_s = sub_s
                    max_sub_length = sub_length
        return max_sub_s, max_sub_length

仅作为代码记录,方便自学自查自纠


http://www.kler.cn/a/325139.html

相关文章:

  • Liunx-Ubuntu22.04.1系统下配置Anaconda+pycharm+pytorch-gpu环境配置
  • 【MySql】实验十六 综合练习:图书管理系统数据库结构
  • 亿咖通科技应邀出席微软汽车行业智享会,分享ECARX AutoGPT全新实践
  • PgSQL汇总
  • resnet50,clip,Faiss+Flask简易图文搜索服务
  • 了解什么是Python(简介)
  • UE 计算闭合曲线的符号面积
  • 剩余电流继电器在轨道交通地铁车站的应用
  • 2、Stable Diffusion
  • 906. 超级回文数
  • 数组的实现原理(Java版)
  • 分享几个可以免费使用GPT的网站【2024年必备】
  • 计算机知识科普问答--20(96-100)
  • 【Python】import 引入常用模块
  • 编程练习:探索数学问题的编程解决方案 P137
  • Unity中的功能解释(数学位置相关和事件)
  • android13 系统默认设置静态IP
  • VMware下Ubuntu找不到共享文件夹
  • 4. 将pycharm本地项目同步到(Linux)服务器上——深度学习·科研实践·从0到1
  • Latex 自定义运算符加限定条件的实现
  • WPF入门教学十 资源与字典
  • Rust结构体初探
  • linux中实现多路复用服务器
  • 使用Python创建EXE运行器和截图工具
  • 【数据结构和算法实践-排序-总结】
  • 9.24作业