题解 | #最长回文子串#
最长回文子串
https://www.nowcoder.com/practice/b4525d1d84934cf280439aeecc36f4af
package main
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param A string字符串
* @return int整型
*/
/*
func ifIJSeqIsValid(A string, i, j int) bool {
isValid := true
p1, p2 := i, j
for p1 <= p2 {
if A[p1] != A[p2] {
isValid = false
break
}
p1++
p2--
}
return isValid
}
func getLongestPalindrome(A string) int {
// write code here
if len(A) < 2 {
return len(A)
}
mxLen := 1
//判断
for i := 0; i < len(A); i++ {
for j := 0; j < len(A); j++ {
isValid := ifIJSeqIsValid(A, i, j)
if isValid && j-i+1 > mxLen {
mxLen = j - i + 1
}
}
}
return mxLen
}
*/
func getLongestPalindrome(A string) int {
// write code here
if len(A) < 2 {
return len(A)
}
mxLen := 1
//记录任意两个字符位置之间是否是回文子串
dp := make([][]bool, len(A))
for i := 0; i < len(A); i++ {
dp[i] = make([]bool, len(A))
dp[i][i] = true
}
//判断;要注意顺序,保证访问dp[i][j]的时候,依赖的dp[i+1][j-1]已经是被访问过的; -> dp[i][j]表示以i为开始的,以j为结尾的字符串是否是回文串;
//访问j-1的时候要保证j-1已经访问过;j采用递减的方式
//访问i+1的时候要保证i+1已经访问过;i采用底层的方式
for j := 1; j < len(A); j++ { //开始位置
for i := j - 1; i >= 0; i-- { //结束位置;循环的顺序不能颠倒,先确定结束字符再确定开始字符
if j-i == 1 {
dp[i][j] = A[i] == A[j]
} else {
dp[i][j] = dp[i+1][j-1] && A[i] == A[j] //这里:j-1的时候;上面已经文芳过;i+1的时候i已经问过
}
if dp[i][j] && j-i+1 > mxLen {
mxLen = j - i + 1
}
}
}
return mxLen
}

查看8道真题和解析