115. 不同的子序列

題目描述

給定一個字符串 S 和一個字符串 T,計算在 S 的子序列中 T 出現的個數。
一個字符串的一個子序列是指,通過刪除一些(也可以不刪除)字符且不干擾剩余字符相對位置所組成的新字符串。(例如,"ACE" 是 "ABCDE" 的一個子序列,而 "AEC" 不是)

題目數據保證答案符合 32 位帶符號整數范圍。

示例 1:
輸入:S = "rabbbit", T = "rabbit"
輸出:3

解釋:
如下圖所示, 有 3 種可以從 S 中得到 "rabbit" 的方案。
(上箭頭符號 ^ 表示選取的字母)

rabbbit
^^^^ ^^
rabbbit
^^ ^^^^
rabbbit
^^^ ^^^
示例 2:
輸入:S = "babgbag", T = "bag"
輸出:5

解釋:
如下圖所示, 有 5 種可以從 S 中得到 "bag" 的方案。 
(上箭頭符號 ^ 表示選取的字母)

babgbag
^^ ^
babgbag
^^    ^
babgbag
^    ^^
babgbag
  ^  ^^
babgbag
    ^^^

解題思路

如果s的最后一個字符與t的最后一個字符不相同,那么就只能從s第0到第n-2字符與t去比較,這樣就有dp[m-1][n]種方式。
如果s的最后一個字符與t的最后一個字符相同,那么除上面那么種外,還可以有dp[m-1][n-1]種。

    int numDistinct(string s, string t) {
        int m = s.size(), n = t.size();
        vector<vector<int>> dp(m+1, vector<int>(n+1, 0));
        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++){
                dp[i][j] = dp[i-1][j];
                if(s[i-1]==t[j-1])
                    dp[i][j] += dp[i-1][j-1];
            }
        }
        return dp[m][n];
    }
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 給定一個字符串 s 和一個字符串 t ,計算在 s 的子序列中 t 出現的個數。字符串的一個 子序列 是指,通過刪...
    MarcQAQ閱讀 317評論 0 0
  • 題意 給定一個字符串 s 和一個字符串 t ,計算在 s 的子序列中 t 出現的個數。 字符串的一個 子序列 是指...
    ST_碼閱讀 291評論 0 0
  • 題目描述(困難難度) 給定兩個字符串 S 和T,從 S 中選擇字母,使得剛好和 T 相等,有多少種選法。 解法一 ...
    windliang閱讀 186評論 0 0
  • 給定一個字符串 S 和一個字符串 T,計算在 S 的子序列中 T 出現的個數。 一個字符串的一個子序列是指,通過刪...
    薄荷糖的味道_fb40閱讀 158評論 0 0
  • 給定一個字符串 S 和一個字符串 T,計算在 S 的子序列中 T 出現的個數。一個字符串的一個子序列是指,通過刪除...
    vbuer閱讀 366評論 0 0

友情鏈接更多精彩內容