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
}
}
本文介绍了一种使用动态规划解决字符串子序列计数问题的方法,通过递归与记忆化技术减少重复计算,最终实现了高效的子序列计数算法。

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



