392.判断子序列
思路
if s[i-1]==t[j-1]{
dp[i][j]=dp[i-1][j-1]+1
}else{
dp[i][j]=dp[i][j-1]
}
思路代码
func isSubsequence(s string, t string) bool {
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]
}
}
}
return dp[len(s)][len(t)]==len(s)
}
115.不同的子序列
思路
确定dp数组(dp table)以及下标的含义
dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]。
思路代码
func numDistinct(s string, t string) int {
dp:=make([][]int,len(s)+1)
for i:=range dp{
dp[i]=make([]int,len(t)+1)
}
for i:=range dp{
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]
}else{
dp[i][j]=dp[i-1][j]
}
}
}
return dp[len(s)][len(t)]
}
今日收获
非连续子序列问题 使用s[i-1]==t[j-1]来判断。