题意理解
给定字符串 SSS 和 TTT,求 TTT 在 SSS 中作为子序列出现的次数。
子序列:从 SSS 中选取若干字符,保持相对顺序不变,组成 TTT。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
思路分析
使用动态规划。
设 dp[i][j]dp[i][j]dp[i][j] 表示:在 SSS 的前 iii 个字符中,组成 TTT 的前 jjj 个字符的方案数。
状态转移:
* 若 S[i−1]≠T[j−1]S[i-1] \neq T[j-1]S[i−1]=T[j−1]:当前字符无法匹配
dp[i][j]=dp[i−1][j]dp[i][j] = dp[i-1][j] dp[i][j]=dp[i−1][j]
* 若 S[i−1]=T[j−1]S[i-1] = T[j-1]S[i−1]=T[j−1]:可以选择用或不用当前字符
dp[i][j]=dp[i−1][j]+dp[i−1][j−1]dp[i][j] = dp[i-1][j] + dp[i-1][j-1] dp[i][j]=dp[i−1][j]+dp[i−1][j−1]
边界条件:
* dp[i][0]=1dp[i][0] = 1dp[i][0]=1:空串是任何串的子序列,方案数为 1
答案: dp[n][m]dp[n][m]dp[n][m]
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
参考代码