首页 > 代码库 > LeetCode: Distinct Subsequences [115]
LeetCode: Distinct Subsequences [115]
【题目】
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
.
【题意】
给定字符串S和T,通过删除S中的若干个字符可以得到T,则T称为S的子序列,问有多少种删法可以得到T【思路】
定义A[i][j] (i>j)表示S[1...i]转化到T[1...j]的方式数(操作类型只有一种,那就是从S中删除若干字符)。
转换方程如下:
如果S[i]==T[j], A[i][j]=A[i-1][j-1]+A[i-1][j];
如果S[i]!=T[j], A[i][j]=A[i-1][j];
初始化矩阵
起始点A[0][0]=1;
第一行A[0][i]=0;
第一列A[i][j]=1;
【代码】
class Solution { public: int numDistinct(string S, string T) { if(S.length()==0 || S.length()==0)return 0; if(S.length()<T.length())return 0; //如果S==T,返回1, 认为有1种转换方式 vector<vector<int> >matrix(S.length()+1, vector<int>(T.length()+1, 0)); //初始化matrix[0][0] matrix[0][0]=1; //初始化对角线 for(int j=1; j<=T.length(); j++) matrix[0][j]=0; //初始化第一列 for(int i=1; i<=S.length(); i++) matrix[i][0]=1; //考虑其他i>j的情况 for(int i=1; i<=S.length(); i++){ for(int j=1; j<=T.length(); j++){ if(S[i-1]==T[j-1])matrix[i][j]=matrix[i-1][j-1]+matrix[i-1][j]; else matrix[i][j]=matrix[i-1][j]; } } return matrix[S.length()][T.length()]; } };
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。