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).
DP,化归为二维地图的走法问题。
r a b b i t
1 0 0 0 0 0 0
r 1
a 1
b 1
b 1
b 1
i 1
t 1
设矩阵transArray,其中元素transArray[i][j]为S[0,…,i] (这里指的是前0到i个字母)到T[0,…,j]有多少种转换方式。
问题就转为从左上角只能走对角(匹配)或者往下(删除字符),到右下角一共有多少种走法。
transArray[i][0]初始化为1的含义是:任何长度的S,如果转换为空串,那就只有删除全部字符这1种方式。
当S[i-1]==T[j-1],说明可以从transArray[i-1][j-1]走对角到达transArray[i][j](S[i-1]匹配T[j-1]),此外还可以从transArray[i-1][j]往下到达transArray[i][j](删除S[i-1])
参考http://www.cnblogs.com/ganganloveu/p/3836519.html
class Solution {
public:
/**
* @param S, T: Two string.
* @return: Count the number of distinct subsequences
*/
int numDistinct(string &S, string &T) {
// write your code here
int lenS=S.size();
int lenT=T.size();
vector<vector<int> >num(lenS+1,vector<int>(lenT+1,0));
for(int i=0;i<=lenS;i++){
num[i][0]=1;
}
for(int i=1;i<=lenS;i++){
for(int j=1;j<=lenT;j++){
if(S[i-1]==T[j-1]){
num[i][j]=num[i-1][j-1]+num[i-1][j];
}else{
num[i][j]=num[i-1][j];
}
}
}
return num[lenS][lenT];
}
};
一维数组即可
class Solution {
public:
/**
* @param S, T: Two string.
* @return: Count the number of distinct subsequences
*/
int numDistinct(string &S, string &T) {
// write your code here
int lenS=S.size();
int lenT=T.size();
//vector<vector<int> >num(lenS+1,vector<int>(lenT+1,0));
vector<int> num(lenT+1,0);
num[0]=1;
/*
for(int i=0;i<=lenS;i++){
num[i][0]=1;
}
*/
for(int i=1;i<=lenS;i++){
/*注意这里保存上一层的值*/
vector<int> oldNum(num);
for(int j=1;j<=lenT;j++){
if(S[i-1]==T[j-1]){
num[j]=oldNum[j-1]+oldNum[j];
}
}
}
return num[lenT];
}
};