算法训练营day46,动态规划14

func max(a, b int) int {

  if a > b {

    return a

  }

  return b

}

//392. 判断子序列

//本题与求最长公共子序列相似,区别在于,如果s是t的子序列,那么最长公共子序列的长度等于s的长度,否则s不是t的子序列

func isSubsequence(s string, t string) bool {

  n := len(s)

  if n == 0 {

    return true

  }

  h := len(t)

  dp := make([][]int, n+1)

  for i := 0; i <= n; i++ {

    dp[i] = make([]int, h+1)

  }

  for i := 1; i <= n; i++ {

    for j := 1; j <= h; j++ {

      if s[i-1] == t[j-1] {

        dp[i][j] = dp[i-1][j-1] + 1

      } else {

        dp[i][j] = max(dp[i][j-1], dp[i-1][j])

      }

      if dp[i][j] == n {

        return true

      }

    }

  }

  return false

}

//115. 不同的子序列

func numDistinct(s string, t string) int {

  n := len(s)

  h := len(t)

  dp := make([][]int, n+1)

  for i := 0; i <= n; i++ {

    dp[i] = make([]int, h+1)

    //如果s为空字符串,则至少有1种,因此初始化为1

    dp[i][0] = 1

  }

  for i := 1; i <= n; i++ {

    for j := 1; j <= h; j++ {

      if s[i-1] == t[j-1] {

        dp[i][j] = dp[i-1][j-1] + dp[i-1][j]

      } else {

        dp[i][j] = dp[i-1][j]

      }

    }

  }

  return dp[n][h]

}

你可能感兴趣的:(算法,动态规划)