5. 最长回文子串

87 阅读1分钟

Problem: 5. 最长回文子串

思路:动态规划

最长回文子串:dp[i][j],以i开头j结尾的串是不是回文子串

递推公式:dp[i][j]是不是回文串,dp[i][j] = s[i] == s[j] && dp[i+1][j-1]是否是回文串。如果串长度<= 3就判断左右边字符是否相同。

初始化:dp[i][j] = true,其中 i== j

遍历顺序:斜下方遍历,然后向右平移。这个遍历顺序可以把dp[i+1][j-1] 用之前初始化

初始化:caba image.png

Code

func longestPalindrome(s string) string {
	dp := make([][]bool, len(s))
	for i := 0; i < len(s); i++ {
		dp[i] = make([]bool, len(s))
		dp[i][i] = true // 根据case 1 初始数据
	}
	max := 0
	str := s[0:1]
	for j := 0; j < len(s); j++ {
		for i, k := 0, j; i <= k && k < len(s); k++ {
			if s[i] == s[k] {
				if k-i < 3 {
					dp[i][k] = true
					if max < k-i+1 {
						max = k - i + 1
						str = s[i : k+1]
					}
				} else {
					dp[i][k] = dp[i+1][k-1]
					if dp[i][k] && max < k-i+1 {
						max = k - i + 1
						str = s[i : k+1]
					}
				}
			}
			i++
		}
	}

	return str
}