题解 | #最长回文子串#

最长回文子串

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
}

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务