【Distinct Subsequences】cpp

题目:

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.

代码:

class Solution {
public:
    int numDistinct(string s, string t) {
            const int len_s = s.size();
            const int len_t = t.size();
            if ( len_s<len_t ) return 0;
            if ( len_s==len_t ) return s==t;
            vector<vector<int> > dp(len_t+1,vector<int>(len_s+1,0));
            // initialization
            dp[0][0] = 1;
            for ( int i=1; i<=len_s; ++i ) dp[0][i] = 1;
            // dp process
            for ( int i=1; i<=len_t; ++i )
            {
                for ( int j=1; j<=len_s; ++j )
                {
                    if ( t[i-1]!=s[j-1] )
                    {
                        dp[i][j] = dp[i][j-1];
                    }
                    else
                    {
                        dp[i][j] = dp[i][j-1] + dp[i-1][j-1];
                    }
                }
            }
            return dp[len_t][len_s];
    }
};

tips:

这个题目第一次想到的办法是递归:统计一共要删除多少个字符;每层递归删除一个字符;扫描所有情况。 这种递归的解法大集合肯定会超时。

憋了一会儿dp的解法,这次又把问题想简单了。

这种字符串比较的题目,涉及到记忆化搜索的,可以用二维dp来做。

dp[i][j] 表示T[0:i-1]与S[0:j-1]的匹配次数。

1. 初始化过程,dp[0][i]代表T为空字符,则S若要匹配上T只有把所有字符都删除了一种情况。

2. 状态转移方程:dp[i][j]如何求解?

 这里的讨论点其实很直观,即S[j-1]这个元素到底是不是必须删除。

  a) 如果T[i-1]!=S[j-1],则S[j-1]必须得删除(因为这是最后一个元素,不删肯定对不上T[i-1]); 因此 dp[i][j] = dp[i][j-1],跟S少用一个字符匹配的情况是一样的。

  b) 如果T[i-1]==S[j-1],则S[j-1]可删可不删;因此dp[i][j] = dp[i][j-1] + dp[i-1][j-1]:

    “dp[i][j-1]”是把S[j-1]删了的情况;“dp[i-1][j-1]”是不删除S[j-1]的情况,即用S[j-1]匹配上T[i-1]

按照上述的分析过程,可以写出来DP过程。完毕。

时间: 2025-01-02 00:59:28

【Distinct Subsequences】cpp的相关文章

【Climbing Stairs】cpp

题目: You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top? 代码: class Solution { public: int climbStairs(int n) { int prev = 0; int curr = 1

【Word Break】cpp

题目: Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separated sequence of one or more dictionary words. For example, givens = "leetcode",dict = ["leet", "code"]. Return true becau

【Sudoku Solver】cpp

题目: Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by the character '.'. You may assume that there will be only one unique solution. A sudoku puzzle... ...and its solution numbers marked in red. 代码: cla

【Subsets II】cpp

题目: Given a collection of integers that might contain duplicates, nums, return all possible subsets. Note: Elements in a subset must be in non-descending order. The solution set must not contain duplicate subsets. For example,If nums = [1,2,2], a sol

【LRU Cache】cpp

题目: Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get and set. get(key) - Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.

【Rotate List】cpp

题目: Given a list, rotate the list to the right by k places, where k is non-negative. For example:Given 1->2->3->4->5->NULL and k = 2,return 4->5->1->2->3->NULL. 代码: /** * Definition for singly-linked list. * struct ListNode {

【Text Justification】cpp

题目: Given an array of words and a length L, format the text such that each line has exactly L characters and is fully (left and right) justified. You should pack your words in a greedy approach; that is, pack as many words as you can in each line. Pa

【Simplify Path】cpp

题目: Given an absolute path for a file (Unix-style), simplify it. For example,path = "/home/", => "/home"path = "/a/./b/../../c/", => "/c" click to show corner cases. Corner Cases: Did you consider the case whe

【Implement strStr() 】cpp

题目: Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack. Update (2014-11-02):The signature of the function had been updated to return the index instead of the pointer. If you st