分割回文串——动态规划

79 阅读1分钟

image.png

代码:动态规划

  1. 第一次动态规划,进行预处理问题,得到 dp 数组,dp[i][j] 表示 s[i:j+1] 字符串是否是回文串
  2. 第二次动态规划,f[i] 表示 s[0:i+1] 需要分割多少次
  3. f 数组状态转移时要转移最小值,所以要考虑所有情况,所以 for 循环查找最小值
func minCut(s string) int {
    n := len(s)
    dp := make([][]bool, n)
    for i := range dp {
        dp[i] = make([]bool, n)
        for j := range dp[i] {
            dp[i][j] = true
        }
    }
    for i := n-1; i >= 0; i-- {
        for j := i+1; j < n; j++ {
            dp[i][j] = s[i] == s[j] && dp[i+1][j-1]
        }
    }

    f := make([]int, n)
    for i := range f {
        if dp[0][i] {
            continue
        }
        f[i] = math.MaxInt64
        for j := 0; j < i; j++ {
            if dp[j+1][i] && f[j]+1 < f[i] {
                f[i] = f[j] + 1
            }
        }
    }
    return f[n-1]
}