不同的子序列
题目
给出字符串S和字符串T,计算S的不同的子序列中T出现的个数。
子序列字符串是原始字符串通过删除一些(或零个)产生的一个新的字符串,并且对剩下的字符的相对位置没有影响。(比如,“ACE”是“ABCDE”的子序列字符串,而“AEC”不是)。样例
给出S = “rabbbit”, T = “rabbit”
返回 3题解
我们使用dp(i,j)表示S的i个字符串中T的前j个字符串出现的次数,如果S[i]和T[j]不相等,则dp(i,j)=dp(i-1,j),否则dp(i,j) = dp(i-1,j)+dp(i-1,j-1),类似01背包,i的状态只与i-1有关,再使用滚动数组优化。
public class Solution {
/**
* @param S, T: Two string.
* @return: Count the number of distinct subsequences
*/
public int numDistinct(String S, String T) {
int[] dp = new int[T.length()+1];
dp[0] = 1;
for (int i=1;i<=S.length();i++)
{
for (int j=T.length();j>0;j--)
{
dp[j] += T.charAt(j-1)==S.charAt(i-1)?dp[j-1]:0;
}
}
return dp[T.length()];
}
}
Last Update 2016.10.14