go解题答案

  • 时间复杂度O(m*n)
  • 思路概括:动态规划
  • 思路核心:
    1、dp[i][j] = dp[i + 1][j + 1] + 1 或者 0 //从i,j开始最大子串是i+1,j+1开始加1,或者是0
    2、从后往前遍历
    func LCS( str1 string , str2 string ) string {
    n, m := len(str1), len(str2)
    //初始化
    //dp[i][j] 代表从str1 从i开始,str2从j开始,最大的公共串
    dp := make([][]int, n + 1) // 因为0,0没意义,所以长度是n+1
    for i := 0; i < len(dp); i++ {
      dp[i] = make([]int, m + 1) 
    }
    ans := 0
    h:=map[int]int{}
    for i := n - 1; i >= 0; i-- { //因为状态转移方程是后一个推出前一个,所以遍历要从后往前
      for j := m - 1; j >= 0; j-- {
          if str1[i] == str2[j] {
              dp[i][j] = dp[i + 1][j + 1] + 1 //从i,j开始最大子串是i+1,j+1开始加1,或者是0
          } else {
              dp[i][j] = 0
          }
          if ans < dp[i][j] {
              ans = dp[i][j]
              h[ans]=i // 记录最大时候的起始位置
          }
      }
    }
    start:= h[ans]
    return str1[start:start+ans] // 截取最大公共串

}