判斷子序列
力扣題目鏈接
其實就是最長公共子序列的變種題。
但遞推公式可以簡化為:
若nums1[i-1] !=nums2[j-1]時
dp[i][j]=dp[i][j-1] //因為s長度更短
var isSubsequence = function(s, t) {
let dp=new Array(s.length+1).fill(0).map(ele=> new Array(t.length+1).fill(0))
let res=0
for(let i=1;i<=s.length;i++){
for(let j=1;j<=t.length;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]
}
res=Math.max(res,dp[i][j])
}
}
return res===s.length
};
不同的子序列
- dp數組含義:
dp以i-1,j-1結尾的不同子序列的個數 - 遞推公式:
s[i-1]=t[j-1],dp[i][j]=dp[i-1][j-1]+dp[i-1][j]
s[i-1] !=t[j-1],dp[i][j]=dp[i-1][j] - 初始化:
dp[0][j]=0,dp[i][0]=1 - 遍歷順序
順序
var numDistinct = function(s, t) {
let dp=new Array(s.length+1).fill(0).map(()=> new Array(t.length+1).fill(0))
for(let i=0;i<=s.length;i++){
dp[i][0]=1
}
for(let i=1;i<=s.length;i++){
for(let j=1;j<=t.length;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[s.length][t.length]
};