DP状态转移方法--leetcode115
Leetcode115题:
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).
It's guaranteed the answer fits on a 32-bit signed integer.
S:"rabbbit"
T:"rabbit"
从s中一共可以获取5中T的方法。
解题思路:一般类似这种两个字符串匹配的题目,我们都可以利用二维dp解决,但是难点在于状态转移的得出,下面我们可以采用利用示例写出状态转移结果回推规律的方法:
public int numDistinct(String s, String t) {
int sl = s.length();
int tl = t.length();
if(sl<tl)
return 0;
//dp[i][j]代表str1长度是i,str2长度为j的范围内满足的数
int [][]dp = new int[sl][tl];
int count = 0;
for(int i = 0;i < sl;i++)
dp[i][0] = s.charAt(i)==t.charAt(0)?++count:count;
for(int j = 1;j < tl;j++)
{
//"rabbbit"
//"rabbit"
for(int i = 1;i < sl;i++)
{
if(t.charAt(j)!=s.charAt(i))
dp[i][j] = dp[i-1][j];
else
dp[i][j] = dp[i-1][j]+dp[i-1][j-1];
}//for j
}//for i
return dp[sl-1][tl-1];
}