IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> LC 5. 最长回文子串(动态规划/中心扩散 - 中等) -> 正文阅读

[数据结构与算法]LC 5. 最长回文子串(动态规划/中心扩散 - 中等)

LC 5. 最长回文子串

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

? ? ? ? ? 示例 1:? 输入:s = "babad"??输出:"bab"或"aba"

? ? ? ? ? 示例 2:? 输入:s = "cbbd"? ?输出:"bb"

? ? ? ? ? 示例 3:?输入:s = "a"? ? ? ? ?输出:"a"

? ? ? ? ? 示例 4:? 输入:s = "ac"? ? ? ?输出:"a"

思路1:动态规划

? ? ? ? 状态含义
? ? ? ? ? ? 可以以子串长度进行遍历 (begin ?end)
? ? ? ? ? ? d[i][j]: 代表以 i 为开头 以 j 为结尾的字符串 是否是回文串 ? 有 0 和 1 两个取值
? ? ? ? 动态方程
? ? ? ? ? ? d[i][j] = d[i+1][j-1] ?当 s[i]=s[j] ? ? ? ? ?i j 之间最少3个元素(加上其本身)?适合长度大于3的子串
? ? ? ? ? ? ? ? ? ? ? ? ? 0 ? ? ? ? ? ?当 s[i]!=s[j]
? ? ? ? 初始化
? ? ? ? ? ? 子串长度为1: 即 i == j 时 ?d[i][j] = 1
? ? ? ? ? ? 子串长度为2: 即 j = i+1 当 s[i]=s[j] ?d[i][j] = 1 ?否则为0?
? ? ? ? ? ? ? ? ? ? ?b ? a ? b ? a ? d
? ? ? ? ? ? ? ? ? ? ?0 ? 1 ? 2 ? 3 ? 4
? ? ? ? ? ? b ? 0 ?1 ? 0
? ? ? ? ? ? a ? 1? ? ? ?1 ? 0
? ? ? ? ? ? b ? 2? ? ? ? ? ? 1 ? 0
? ? ? ? ? ? a ? 3? ? ? ? ? ? ? ? ?1 ? 0
? ? ? ? ? ? d ? 4? ? ? ? ? ? ? ? ? ? ? 1
? ? ? ? 例:
? ? ? ? ? ? ? ? ?b ? a ? b ? a ? d
? ? ? ? ? ? ? ? ?0 ? 1 ? 2 ? 3 ? 4
? ? ? ? b ? 0 ?1 ? 0? ?1? ?0? ?0
? ? ? ? a ? 1? ? ?? 1 ? 0? ?1? ?0
? ? ? ? b ? 2? ? ? ? ? ? 1 ? 0? ?0
? ? ? ? a ? 3? ? ? ? ? ? ? ? ?1 ? 0
? ? ? ? d ? 4? ? ? ? ? ? ? ? ? ? ? 1

复杂度1:时间复杂度O(n^2)? ? 空间复杂度 O(n^2)

PS:该题变形

? ? ? ? ① 最短回文子串,记录最短即可

? ? ? ? ② 输出所有回文子串:二次遍历,所有1对应的start和end代表的子串进行添加到集合中,避免重复。

代码1:

def longestPalindrome2(s):
    n = len(s)
    d = [[0]*n for _ in range(n)]

    # 初始化
    begin, end = 0, 0
    for i in range(n):
        d[i][i] = 1
        if i < n-1 and s[i]==s[i+1]:
            d[i][i+1] = 1
            if 1 > end - begin:
                begin, end = i, i+1
    # i 代表长度  可取值 3 4  5 …… n
    for i in range(3, n+1):
        # j 代表起始位置
        for j in range(n-i+1):
            k = i + j - 1
            if s[j] == s[k]:
                d[j][k] = d[j+1][k-1]
                if k-j > end-begin and d[j+1][k-1] == 1:
                    begin, end = j, k
    return s[begin:end+1]

思路2:中心扩散

? ? ? ? 遍历整个字符串
? ? ? ? ? ? ①对于每个字符串 向两边扩散判断
? ? ? ? ? ? ② 扩散时候分为两种情况
? ? ? ? ? ? ? ? i 长度为 1 的中心 (bab)
? ? ? ? ? ? ? ? ii 长度为 2 的中心 (bb)

代码2:

def findboders(s, left, right):
    while left >= 0 and right < len(s) and s[left] == s[right]:
        left, right = left - 1, right + 1
    # while循环完  上边的left和right不符条件  他们的上一组才符合条件
    return left + 1, right - 1

def rewirtelongestPalindrome1(s):
    n = len(s)
    # 遍历整个字符串
    begin, end = 0, 0
    for i in range(n):
        left1, right1 = findboders(s, i, i)
        left2, right2 = findboders(s, i, i+1)
        if right1 - left1 > end - begin:
            begin, end = left1, right1
        if right2 - left2 > end - begin:
            begin, end = left2, right2
    return s[begin:end+1]

复杂度:时间复杂度O(n^2)? ? 空间复杂度 O(n)? ? ?

路虽远,行则将至。事虽难,做则必成?

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-31 16:53:22  更:2021-07-31 16:53:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/7 19:39:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码