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.
http://leetcode.com/onlinejudge#question_115
this is quite similar to the common subsequence problem. so dp comes to your mind.
it's not quite straightforward, so we can first try recursion. the idea is when you find s[i]=t[j], use recursion for two remaining substrings. base case is when the substring of t is null, then you can plus one for the distinct numbers. and don't forget to use memorizing to reduce redundant recursions.
so for dp, the idea is similar. dp[i][j]= dp[i-1][j] + (s[i]==t[j])?dp[i-1][j-1]:0; it means if you find two chars are same, then you have the same number of dinstinct subs of dp[i-1][j-1]. otherwise, it will be simply dp[i-1][j] which is the previous sub no.
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.
http://leetcode.com/onlinejudge#question_115
this is quite similar to the common subsequence problem. so dp comes to your mind.
it's not quite straightforward, so we can first try recursion. the idea is when you find s[i]=t[j], use recursion for two remaining substrings. base case is when the substring of t is null, then you can plus one for the distinct numbers. and don't forget to use memorizing to reduce redundant recursions.
so for dp, the idea is similar. dp[i][j]= dp[i-1][j] + (s[i]==t[j])?dp[i-1][j-1]:0; it means if you find two chars are same, then you have the same number of dinstinct subs of dp[i-1][j-1]. otherwise, it will be simply dp[i-1][j] which is the previous sub no.
public class Solution {
public int numDistinct(String S, String T) {
int l=S.length(),m=T.length();
if(m==0||l==0) return 0;
int dp[][]=new int[l][m];
for(int i=0;i<l;i++){
for(int j=0;j<=Math.min(i,m-1);j++){
if(S.charAt(i)==T.charAt(j)){
dp[i][j]=(i==0||j==0)?1:dp[i-1][j-1];
}
dp[i][j]+=i-1<j?0:dp[i-1][j];
}
}
return dp[l-1][m-1];
// Start typing your Java solution below
// DO NOT write main() function
}
}