• LeetCode:5. 最长回文子串


    5. 最长回文子串

    难度中等5526

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

    示例 1:

    输入:s = "babad"
    输出:"bab"
    解释:"aba" 同样是符合题意的答案。
    

    示例 2:

    输入:s = "cbbd"
    输出:"bb"
    

    提示:

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

    思路:参考视频:史上最燃算法刷题!Leetcode 5. 最长回文子串_哔哩哔哩_bilibili

    动态规划,找出状态转移方程如下:

    • 对于 j - i > 2 的情况:dp[i][j]的状态转移方程可能取决于dp[i+1][j-1],所以不能使用常规从前往后的二位数组遍历方式;可以将i从后往前遍历将j在i+1的基础上向后遍历。也就是先获取后面dp[i+1][j-1]的状态值,再进而推导出前面dp[i][j]的状态值
    • 注意:单独字符本身也属于最小的回文子串,比如单独的字符:a

    时间复杂度:O(N²),其中 N 是字符串的长度,动态规划的状态总数为 O(N²)

    空间复杂度:O(N²),需要额外申请二维数组dp[i][j]来存储每个状态值

    1. // 动态规划1:参考b站视频:https://www.bilibili.com/video/BV1dN4y1g7p9?spm_id_from=333.337.search-card.all.click&vd_source=2c268e25ffa1022b703ae0349e3659e4
    2. // dp[i][j]的状态转移方程可能取决于dp[i+1][j-1],所以不能使用常规的二位数组遍历方式;
    3. // 可以将i从后往前遍历,将j在i+1的基础上向后遍历;
    4. // 也就是先从后向前获取dp[i+1][j-1]的状态值,再进而获取dp[i][j]的状态值。
    5. func longestPalindrome(s string) string {
    6. length := len(s)
    7. // if length <= 1 {
    8. // return s
    9. // }
    10. // 题目要求:1 <= s.length <= 1000,所以最小子串为单独字符本身
    11. var res string = s[0:1]
    12. // 初始化二维数组
    13. dp := make([][]bool, length)
    14. for i := 0; i < length; i++ {
    15. dp[i] = make([]bool, length)
    16. }
    17. for i := length - 1; i >= 0; i-- {
    18. for j := i + 1; j < length; j++ {
    19. if i == j {
    20. dp[i][j] = true
    21. } else if j-i <= 2 { // s[i] == s[j] 并且i、j间距小于等于2的子串都为true,比如aba(2-0=2) aa(1-0=1) a(0-0=0)等于0也就是单独字符本身
    22. dp[i][j] = s[i] == s[j]
    23. } else {
    24. dp[i][j] = s[i] == s[j] && dp[i+1][j-1]
    25. }
    26. if dp[i][j] && j-i+1 >= len(res) {
    27. res = s[i : i+j-i+1]
    28. }
    29. }
    30. }
    31. return res
    32. }
    33. // 动态规划2:参考b站视频:https://www.bilibili.com/video/BV1AA411B7XV?spm_id_from=333.337.search-card.all.click&vd_source=2c268e25ffa1022b703ae0349e3659e4
    34. // func longestPalindrome(s string) string {
    35. // length := len(s)
    36. // if length <= 1 {
    37. // return s
    38. // }
    39. // // 初始化二维数组并将对角线dp[i][i]为true。即i=j时,i开始j结尾的字符串
    40. // dp := make([][]bool, length)
    41. // for i := 0; i < length; i++ {
    42. // dp[i] = make([]bool, length)
    43. // }
    44. // for i := 0; i < length; i++ {
    45. // dp[i][i] = true
    46. // }
    47. // max, start := 1, 0 // 注意:max初始为1,一个字符本身也算是回文子串
    48. // // todo: i和j循环位置调换
    49. // for j := 1; j < length; j++ {
    50. // for i := 0; i < length-1 && i < j; i++ {
    51. // if s[i] != s[j] { // asc码值比较
    52. // dp[i][j] = false
    53. // } else {
    54. // if j - i <= 2 { // s[i] == s[j] 并且i、j间距小于等于2的子串都为true,比如aba(2-0=2) aa(1-0=1) a(0-0=0)等于0也就是单独字符本身
    55. // dp[i][j] = true
    56. // } else {
    57. // dp[i][j] = dp[i+1][j-1] // ???
    58. // }
    59. // }
    60. // if dp[i][j] && j-i+1 > max {
    61. // max = j-i+1
    62. // start = i
    63. // }
    64. // }
    65. // }
    66. // return s[start:start+max]
    67. // }

  • 相关阅读:
    【网络协议】ARP协议
    牛血清白蛋白-铂复合纳米材料/HSA-Pc NPs人血清白蛋白(HSA)包裹酞菁分子纳米粒
    小米手环8pro重新和手机配对解决办法
    excel英文自动翻译成中文教程
    『Linux小程序』进度条
    Ubuntu 18.04安装fast-dds
    力扣每日一题 ---- 2906. 构造乘积矩阵
    Netty源码学习4——服务端是处理新连接的&netty的reactor模式
    数据库的由来与发展历程
    【计算机网络】初步了解TCP/IP四层模型
  • 原文地址:https://blog.csdn.net/qq_37102984/article/details/126123144