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

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];
    }
}
时间: 2024-08-07 08:39:45

lintcode-medium-Distinct Subsequences的相关文章

LintCode刷题笔记-- 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 rel

Distinct Subsequences

https://leetcode.com/problems/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 non

LeetCode115 Distinct Subsequences

Given a string S and a string T, count the number of distinct subsequences of T in S. (Hard) 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 re

[LeetCode] 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

leetcode 115. 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

[leetcode]Distinct Subsequences @ Python

原题地址:https://oj.leetcode.com/problems/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

leetcode 之 Distinct Subsequences

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 di

LeetCode: Distinct Subsequences

LeetCode: 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

Distinct Subsequences(不同子序列的个数)——b字符串在a字符串中出现的次数、动态规划

Given a string S and a string T, count the number of distinct subsequences ofT inS. 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 po

UVa 10069 Distinct Subsequences(大数 DP)

?? 题意 求母串中子串出现的次数(长度不超过1后面100个0  显然要用大数了) 令a为子串 b为母串 d[i][j]表示子串前i个字母在母串前j个字母中出现的次数   当a[i]==b[j]&&d[i-1][j-1]!=0时 d[i][j]=d[i-1][j-1]+d[i][j-1] (a[i]==b[j]时 子串前i个字母在母串前j个字母中出现的次数 等于 子串前i-1个字母在母串前j-1个字母中出现的次数 加上 子串前i个字母在母串前j-1个字母中出现的次数 a[i]!=b[j]时