Distinct Subsequences

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).

Here is an example:
S = "rabbbit", T = "rabbit"

Return 3.

题目中给定两个字符串s和t,让我们输出从s变化到t有多少种不同的变换方法,要求只能从s中删除字符(可以不删) 不能改变字符原有的顺序。我们用动态规划的思想来做,首先构造一个二维的DP数组,DP[i][j]代表s.substring(0, i + 1) 变换到t.substring(0, j + 1)有多少种变换方法。当s.charAt(i) == t.charAt(j)时,我们可以保留当前字符s.charAt(i),这时有DP[i-1][j-1]种方法;也可以删除s.charAt(i),这时有DP[i - 1][j]种方法;综上所述,当s.charAt(i) == t.charAt(j)时,DP[i][j] = DP[i - 1][j] + DP[i-1][j-1]。如果s.charAt(i) != t.charAt(j)时,我们只能将s.charAt(i)删除,这时DP[i][j] = DP[i - 1][j]。代码如下:
public class Solution {
    public int numDistinct(String s, String t) {
        int m = s.length();
        int n = t.length();
        int[][] dp = new int[m + 1][n + 1];
        for(int i = 0; i <= m; i++)
            dp[i][0] = 1;
        for(int i = 1; i <= m; i++)
            for(int j = 1; j <= n; j++) {
                if(s.charAt(i - 1) == t.charAt(j - 1)) {
                    dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];
                } else {
                    dp[i][j] = dp[i - 1][j];
                }
            }
        return dp[m][n];
    }
}

猜你喜欢

转载自kickcode.iteye.com/blog/2276104