【剑指offer】最长回文子串 [Go语言]

110 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

题目

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

示例 1:

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

示例 2:

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

思路

我们可以一直进行遍历,就是从长度为2开始。因为是连续的回文子串,然后我们可以从3开始,之后再从4开始,一直扩展遍历。全遍历完一遍就可以知道最长的回文子串了。

AC Code

func longestPalindrome(A string) string {
    if len(A)==1 || (len(A)==2&&A[0]!=A[1]) {
        return  string(A[0])
    }
(1)    dp := make([][]bool,len(A))
(2)    for i:=range dp{
(3)        dp[i]=make([]bool,len(A))
    }
(4)    for i := range dp {
(5)        dp[i][i]=true
    }
(6)    j := 0
(7)    maxLen:=0
(8)    ans := ""
(9)    for L:=2;L<=len(A);L++{
(10)        for i:=0; i<=len(A); i++{
(11)            j = L+i-1
(12)            if j >= len(A) {
(13)                break
            }
(14)            if A[i] != A[j] {
(15)                dp[i][j] = false
(16)            } else {
(17)                if j-i < 3 {
(18)                    dp[i][j] = true
                } else {
(19)                    dp[i][j] = dp[i+1][j-1]
                }
            }
(20)            if dp[i][j] && j - i + 1 > maxLen {
(21)                maxLen = j - i + 1
(22)                ans=A[i:j+1]
            }
        }
    }
    return ans
}
  • (1) 定义一个dp,作为二维矩阵的,记录状态
  • (2) 对这个dp进行二维矩阵的加载
  • (3) 给二维矩阵扩展空间
  • (4) 遍历这个二维矩阵
  • (5) 给对角线进行赋值,因为对角线就是这个字母本身,所以本身一定是回文的
  • (6) 定义j。j表示这个这个子串的end位置,因为我们是对这个子串的每个字符进行遍历判断
  • (7) 定义maxLen最长字串
  • (8) 定义答案
  • (9) 定义L作为字串的长度,比如L=2,就两个两个字符进行判断,看看是不是回文串,如果是3就3个3个字符进行判断,依次内推
  • (10) 遍历这个字符串长度
  • (11) 定义这个j的值,j的值就是L+i-1,就是这一趟遍历的长度再加上i(头),再减1就是这个下标了,注意这个j是下标啊!
  • (12) 如果这个j已经大于这个长度A了
  • (13) 就直接break掉
  • (14) 如果A[i]!=A[j]就说明这个字串的头尾不相等
  • (15) 我们就可以标志这个dp[i][j]为false就好了
  • (16) 如果是相等的
  • (17) 如何这个j-i是小于3,就说明这个一定是true的,类似bab这种,L=3就一定就是回文串了
  • (18) 将这个dp[i][j]状态就为true了
  • (19) 如果不是小于3的,就让这个状态等于他的下一个对角线以下的节点的状态
  • (20) 如果这个dp[i][j]是true,并且这个j-i+1是大于maxLen的话,也就是现在遍历到的最大的长度是大于maxLen的话
  • (21) 我们让maxLen等于j-i+1
  • (22) 让ans等于A[i:j+1]