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).
Given S = "rabbbit"
, T = "rabbit"
, return 3
.
动态规划,用一个int二维数组记录:字符串T中前j个字符(0-j-1)在字符串S中前i个字符(0-i-1)中不同的子序列的个数
状态转移:
对任何一种情况,T中前j个字符在S中前i个字符出现的次数,至少等于T中前j个字符在S中前i-1个字符的次数,这里包含一个特殊情况,如果j == i,这个值为0
如果T的第j - 1个字符和S的i - 1个字符不同,所以S中再增加一个字符不会改变结果,则dp[i][j] = dp[i - 1][j]
如果相同,则dp[i][j] 在dp[i - 1][j]的基础上,还要再包括T中前j-1个字符在S中前i-1个字符中出现的次数(即先把两个字符串的最后一个字符匹配到一起,再考虑之前的情况),dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1]
public class Solution { /** * @param S, T: Two string. * @return: Count the number of distinct subsequences */ public int numDistinct(String S, String T) { // write your code here if(S == null || S.length() == 0) return 0; if(T == null || T.length() == 0) return 1; int m = S.length(); int n = T.length(); if(n > m) return 0; int[][] dp = new int[m + 1][n + 1]; dp[0][0] = 1; for(int i = 0; i <= m; i++) dp[i][0] = 1; for(int j = 1; j <= n; j++){ char T_end = T.charAt(j - 1); for(int i = j; i <= m; i++){ char S_end = S.charAt(i - 1); dp[i][j] = dp[i - 1][j]; if(S_end == T_end) dp[i][j] += dp[i - 1][j - 1]; } } return dp[m][n]; } }