// 21 392.判断子序列
package main
import "fmt"
func isSubsequence(s string, t string) bool {
//本题本质上为最长公共子序列长度
//dp[i][j]表示s以nums[i-1],t以nums[j-1]结尾的最长公共子序列长度,初始化为全0
dp := make([][]int, len(s)+1)
for i, _ := range dp {
dp[i] = make([]int, len(t)+1)
}
//遍历顺序为从左到右从上到下
for i := 1; i <= len(s); i++ {
for j := 1; j <= len(t); j++ {
if s[i-1] == t[j-1] {
dp[i][j] = dp[i-1][j-1] + 1
} else {
dp[i][j] = dp[i][j-1] //删除t中元素
}
}
}
return dp[len(s)][len(t)] == len(s)
}
func main() {
s := "abc"
t := "ahbgdc"
res := isSubsequence(s, t)
fmt.Printf("res: %v\n", res) //res: true
}
// 22 115.不同的子序列
package main
import "fmt"
func numDistinct(s string, t string) int {
// dp[i][j]表示以i-1结尾的s中以j-1为结尾的t的个数
dp := make([][]int, len(s)+1)
for i, _ := range dp {
dp[i] = make([]int, len(t)+1)
}
//初始化dp数组,dp[0][0]=1,dp[0][j]=0,dp[i][0]=1
for i := 0; i <= len(s); i++ {
dp[i][0] = 1
}
//遍历顺序从左往右从上到下
for i := 1; i <= len(s); i++ {
for j := 1; j <= len(t); j++ {
if s[i-1] == t[j-1] {
dp[i][j] = dp[i-1][j-1] + dp[i-1][j] //dp[i-1][j]表示删除s中最后一个元素
} else {
dp[i][j] = dp[i-1][j]
}
}
}
return dp[len(s)][len(t)]
}
func main() {
s := "babgbag"
t := "bag"
res := numDistinct(s, t)
fmt.Printf("res: %v\n", res)
}