题解 | #最长回文子串#

最长回文子串

https://www.nowcoder.com/practice/b4525d1d84934cf280439aeecc36f4af

package main

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param A string字符串
 * @return int整型
 */
func getLongestPalindrome(A string) int {
	n := len(A)
	t := make([]byte, n+n+1)
	t[0] = '#'
	m := 1
	for i := 0; i < n; i++ {
		t[m] = A[i]
		m++
		t[m] = '#'
		m++
	}
	maL, maR := 0, -1
	dp := make([]int, len(t))
	for i := 0; i < m; i++ {
		curL, curR, k := i, i, 1
		if i >= maL && i <= maR {
			mid := (maR + maL) / 2
			j := mid - (i - mid)
			if j-dp[j]/2 > maL {
				dp[i] = dp[j]
				continue
			} else {
				curR = maR
				k = maR - i
				curL = i - k
			}
		}
		for ; i-k >= 0 && i+k < m && t[i-k] == t[i+k]; k++ {
			curL = i - k
			curR = i + k
		}
		dp[i] = curR - curL + 1
		if dp[i] > maR-maL+1 {
			maL = curL
			maR = curR
		}
	}
	return (maR - maL) / 2
	// write code here
}

全部评论

相关推荐

11-28 17:48
中山大学 C++
点赞 评论 收藏
分享
jack_miller:我给我们导员说我不在这里转正,可能没三方签了。导员说没事学校催的时候帮我想办法应付一下
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务