题目链接:https://leetcode.com/problems/distinct-subsequences/
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).
Example 1:
Input: S ="rabbbit"
, T ="rabbit" Output: 3
Explanation: As shown below, there are 3 ways you can generate "rabbit" from S. (The caret symbol ^ means the chosen letters)rabbbit
^^^^ ^^rabbbit
^^ ^^^^rabbbit
^^^ ^^^
思路:
用DP,难点在于如何找出递推式,
看下面一张图就了解了:
递推式为:dp[i][j] = dp[i][j-1] + (s[i] == t[j]) ? dp[i-1][j-1] : 0
AC 4ms 95% Java:
class Solution {
public int numDistinct(String s, String t) {
int m=t.length(),n=s.length();
int[][] dp=new int[m+1][n+1];
for(int j=0;j<dp[0].length;j++){
dp[0][j]=1;
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
dp[i][j]=dp[i][j-1]+(s.charAt(j-1)==t.charAt(i-1)?dp[i-1][j-1]:0);
}
}
return dp[m][n];
}
}
注意在循环中(i-1)(j-1)才是当前字符串的下标。