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]