欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++實(shí)現(xiàn)LeetCode(115.不同的子序列)

 更新時(shí)間:2021年07月23日 15:24:04   作者:Grandyang  
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(115.不同的子序列),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

[LeetCode] 115. Distinct Subsequences 不同的子序列

Given a string S and a string T, count the number of distinct subsequences of S which equals T.

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

Example 1:

Input: S =

"rabbbit"

, T =

"rabbit"
Output: 3

Explanation:

As shown below, there are 3 ways you can generate "rabbit" from S.
(The caret symbol ^ means the chosen letters)

rabbbit

^^^^ ^^

rabbbit

^^ ^^^^

rabbbit

^^^ ^^^

Example 2:

Input: S =

"babgbag"

, T =

"bag"
Output: 5

Explanation:

As shown below, there are 5 ways you can generate "bag" from S.
(The caret symbol ^ means the chosen letters)

babgbag

^^ ^

babgbag

^^    ^

babgbag

^    ^^

babgbag

  ^  ^^

babgbag

    ^^^

看到有關(guān)字符串的子序列或者配準(zhǔn)類的問題,首先應(yīng)該考慮的就是用動(dòng)態(tài)規(guī)劃 Dynamic Programming 來求解,這個(gè)應(yīng)成為條件反射。而所有 DP 問題的核心就是找出狀態(tài)轉(zhuǎn)移方程,想這道題就是遞推一個(gè)二維的 dp 數(shù)組,其中 dp[i][j] 表示s中范圍是 [0, i] 的子串中能組成t中范圍是 [0, j] 的子串的子序列的個(gè)數(shù)。下面我們從題目中給的例子來分析,這個(gè)二維 dp 數(shù)組應(yīng)為:

  Ø r a b b b i t
Ø
1 1 1 1 1 1 1 1
r
0 1 1 1 1 1 1 1
a
0 0 1 1 1 1 1 1
b
0 0 0 1 2 3 3 3
b
0 0 0 0 1 3 3 3
i
0 0 0 0 0 0 3 3
t
0 0 0 0 0 0 0 3

首先,若原字符串和子序列都為空時(shí),返回1,因?yàn)榭沾彩强沾囊粋€(gè)子序列。若原字符串不為空,而子序列為空,也返回1,因?yàn)榭沾彩侨我庾址囊粋€(gè)子序列。而當(dāng)原字符串為空,子序列不為空時(shí),返回0,因?yàn)榉强兆址荒墚?dāng)空字符串的子序列。理清這些,二維數(shù)組 dp 的邊緣便可以初始化了,下面只要找出狀態(tài)轉(zhuǎn)移方程,就可以更新整個(gè) dp 數(shù)組了。我們通過觀察上面的二維數(shù)組可以發(fā)現(xiàn),當(dāng)更新到 dp[i][j] 時(shí),dp[i][j] >= dp[i][j - 1] 總是成立,再進(jìn)一步觀察發(fā)現(xiàn),當(dāng) T[i - 1] == S[j - 1] 時(shí),dp[i][j] = dp[i][j - 1] + dp[i - 1][j - 1],若不等, dp[i][j] = dp[i][j - 1],所以,綜合以上,遞推式為:

dp[i][j] = dp[i][j - 1] + (T[i - 1] == S[j - 1] ? dp[i - 1][j - 1] : 0)

根據(jù)以上分析,可以寫出代碼如下:

class Solution {
public:
    int numDistinct(string s, string t) {
        int m = s.size(), n = t.size();
        vector<vector<long>> dp(n + 1, vector<long>(m + 1));
        for (int j = 0; j <= m; ++j) dp[0][j] = 1;
        for (int i = 1; i <= n; ++i) {
            for (int j = 1; j <= m; ++j) {
                dp[i][j] = dp[i][j - 1] + (t[i - 1] == s[j - 1] ? dp[i - 1][j - 1] : 0);
            }
        }
        return dp[n][m];
    }
};

Github 同步地址:

https://github.com/grandyang/leetcode/issues/115

參考資料:

https://leetcode.com/problems/distinct-subsequences/

https://leetcode.com/problems/distinct-subsequences/discuss/37327/Easy-to-understand-DP-in-Java

https://leetcode.com/problems/distinct-subsequences/discuss/37412/Any-better-solution-that-takes-less-than-O(n2)-space-while-in-O(n2)-time

到此這篇關(guān)于C++實(shí)現(xiàn)LeetCode(115.不同的子序列)的文章就介紹到這了,更多相關(guān)C++實(shí)現(xiàn)不同的子序列內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言調(diào)用Python代碼的方法

    C語言調(diào)用Python代碼的方法

    這篇文章主要介紹了C語言調(diào)用Python代碼的方法,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • C++實(shí)現(xiàn)簡易計(jì)算器功能

    C++實(shí)現(xiàn)簡易計(jì)算器功能

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡易計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C語言中函數(shù)與指針的應(yīng)用總結(jié)

    C語言中函數(shù)與指針的應(yīng)用總結(jié)

    本篇文章是對(duì)C語言中函數(shù)與指針的應(yīng)用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • Mygui中文換行問題解決方案

    Mygui中文換行問題解決方案

    相信大家解決了中文輸入后一定會(huì)遇到如何解決中文輸入的問題,中文輸入換行問題是很多gui框架都存在的一個(gè)問題,需要的朋友可以了解下
    2012-11-11
  • C語言對(duì)數(shù)組元素進(jìn)行冒泡排序的實(shí)現(xiàn)

    C語言對(duì)數(shù)組元素進(jìn)行冒泡排序的實(shí)現(xiàn)

    這篇文章主要介紹了C語言對(duì)數(shù)組元素進(jìn)行冒泡排序的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • C++實(shí)現(xiàn)一個(gè)簡單消息隊(duì)列的示例詳解

    C++實(shí)現(xiàn)一個(gè)簡單消息隊(duì)列的示例詳解

    消息隊(duì)列在多線程的場景有時(shí)會(huì)用到,尤其是線程通信跨線程調(diào)用的時(shí)候,就可以使用消息隊(duì)列進(jìn)行通信。本文將利用C++實(shí)現(xiàn)一個(gè)簡單的消息隊(duì)列,感興趣的可以了解一下
    2022-12-12
  • c語言?數(shù)據(jù)存儲(chǔ)與原碼?反碼?補(bǔ)碼詳細(xì)解析

    c語言?數(shù)據(jù)存儲(chǔ)與原碼?反碼?補(bǔ)碼詳細(xì)解析

    不知道你是否和我一樣好奇,學(xué)習(xí)編程語言的同時(shí)想,各個(gè)數(shù)據(jù)類型是怎樣在我們的內(nèi)存中儲(chǔ)存的呢,如果你仔細(xì)深入了解的話,你會(huì)了解其中的樂趣,了解科學(xué)家們的偉大,了解c語言
    2022-02-02
  • Qt實(shí)現(xiàn)UDP多線程數(shù)據(jù)處理及發(fā)送的簡單實(shí)例

    Qt實(shí)現(xiàn)UDP多線程數(shù)據(jù)處理及發(fā)送的簡單實(shí)例

    本文主要介紹了Qt實(shí)現(xiàn)UDP多線程數(shù)據(jù)處理及發(fā)送的簡單實(shí)例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C++將字符串格式化的幾種方式總結(jié)

    C++將字符串格式化的幾種方式總結(jié)

    這篇文章主要介紹了C++將字符串格式化的幾種方式總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 大家注意vector, list, set, map成員函數(shù)erase

    大家注意vector, list, set, map成員函數(shù)erase

    set和map是由紅黑樹來實(shí)現(xiàn)的,當(dāng)erase的時(shí)候迭代器就失效了,也就是說我們要在迭代器失效之前保留一個(gè)副本,根據(jù)這個(gè)副本我們才能繼續(xù)遍歷下一個(gè)元素
    2013-09-09

最新評(píng)論