Given a string S and a string T, count the number of distinct subsequences of T in S.
A subsequence of a string is a new string which is formed from the original string by deleting some (can be none) of the characters without disturbing the relative positions of the remaining characters. (ie,"ACE" is a subsequence of "ABCDE" while "AEC" is not).
Here is an example:
S = "rabbbit", T = "rabbit"
Return 3.
题目链接:https://leetcode.com/problems/distinct-subsequences/
题目分析:设dp[i][j]表示T的前缀0~(i-1)在S的前缀0~(j-1)中出现的次数,首先有dp[i][j] = dp[i][j - 1],若t[i] == s[j]则dp[i][j] += dp[i - 1][j - 1]
S="abcab",T="ab"
a b c a b
0 1 1 1 1 1 1
1 a 0 1 1 1 2 2
2 b 0 0 1 1 1 3
public class Solution {
public int numDistinct(String s, String t) {
int lens = s.length();
int lent = t.length();
if (lens < lent) {
return 0;
}
int[][] dp = new int[lent + 1][lens + 1];
for (int j = 0; j < lens; j ++) {
dp[0][j] = 1;
}
for (int i = 0; i < lent; i ++) {
for (int j = 0; j < lens; j ++) {
dp[i + 1][j + 1] = dp[i + 1][j];
if (t.charAt(i) == s.charAt(j)) {
dp[i + 1][j + 1] += dp[i][j];
}
}
}
return dp[lent][lens];
}
}

本文介绍了一种计算字符串T在字符串S中不同子序列数量的方法。通过动态规划算法实现,利用二维数组dp记录中间结果,避免重复计算。文章提供了一个具体的例子进行说明,并附带了完整的Java代码实现。
1333

被折叠的 条评论
为什么被折叠?



