题目描述
Given a string S and a string T, count the number of distinct subsequences of S which equals T.
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相等的个数。
1. 利用递归的方式求解,超时。
2. 利用动态规划的方式求解,首先初始化数组result[t.length()+1][s.length()+1],result[i][j]代表S[0:j]的子序列与字符串T[0:i]相等的个数,同时将数组的第一行全部初始化为1,这是因为T为空的时候可以通过将S中的所有位置的字符都删掉构成的序列与T相等。
转移方程为:
如果s.charAt(j)==t.charAt(i):result[i+1][j+1]=result[i][j]+result[i+1][j+1];如果i和j位置的字符相等,可以有两种选择,将S中j位置的元素删掉result[i+1][j]或者保留S中j位置的元素result[i][j].否则,result[i+1][j+1]=result[i+1][j],只能删掉j位置的字符。
代码
- 递归求解
class Solution {
int count = 0;
public int numDistinct(String s, String t) {
if(s == null || t == null || s.length() < t.length())
return 0;
numCore(s,t,0,0);
return count;
}
private void numCore(String s,String t,int sp,int st){
if(st >= t.length()){
count++;
return;
}
if(s.length()-sp >= t.length()-st){
if(s.charAt(sp) == t.charAt(st)){
numCore(s,t,sp+1,st+1);
}
numCore(s,t,sp+1,st);
}
}
}
- 动归
class Solution {
public int numDistinct(String s, String t) {
if(s == null || t == null || s.length() < t.length())
return 0;
int[][] result = new int[t.length()+1][s.length()+1];
for(int i=0;i<=s.length();i++){
result[0][i] = 1;
}
for(int i=0;i<t.length();i++){
for(int j=0;j<s.length();j++){
if(s.charAt(j) == t.charAt(i)){
result[i+1][j+1] = result[i][j] + result[i+1][j];
}else
result[i+1][j+1] = result[i+1][j];
}
}
return result[t.length()][s.length()];
}
}