国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【LeetCode動態(tài)規(guī)劃#10】完全背包問題實戰(zhàn),其三(單詞拆分,涉及集合處理字符串)

這篇具有很好參考價值的文章主要介紹了【LeetCode動態(tài)規(guī)劃#10】完全背包問題實戰(zhàn),其三(單詞拆分,涉及集合處理字符串)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

單詞拆分

力扣題目鏈接(opens new window)

給定一個非空字符串 s 和一個包含非空單詞的列表 wordDict,判定 s 是否可以被空格拆分為一個或多個在字典中出現(xiàn)的單詞。

說明:

拆分時可以重復(fù)使用字典中的單詞。

你可以假設(shè)字典中沒有重復(fù)的單詞。

示例 1:

  • 輸入: s = "leetcode", wordDict = ["leet", "code"]
  • 輸出: true
  • 解釋: 返回 true 因為 "leetcode" 可以被拆分成 "leet code"。

示例 2:

  • 輸入: s = "applepenapple", wordDict = ["apple", "pen"]
  • 輸出: true
  • 解釋: 返回 true 因為 "applepenapple" 可以被拆分成 "apple pen apple"。
  • 注意你可以重復(fù)使用字典中的單詞。

示例 3:

  • 輸入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
  • 輸出: false

思路

如果要往背包問題上靠的話,可以把wordDict中的單詞視為"物品"把字符串s的長度視為背包容量(注意,這里說的是長度,即s.size)

思路聽上去很常規(guī),但是具體到實現(xiàn)方式上就有點復(fù)雜

五步走

1、確定dp數(shù)組含義

如果拿不準(zhǔn)dp數(shù)組中的元素是什么類型,可以看看題目的示例返回的是什么類型的值,那一般就是需要找的值

這里題目要判定字典wordDict中的單詞能不能拼成字符串s

那么實現(xiàn)過程中肯定要用字典wordDict中的單詞與當(dāng)前遍歷區(qū)間內(nèi)截取到的子串進(jìn)行比較,要么相同要么不同,再結(jié)合示例的返回值,可以判斷dp數(shù)組中的值應(yīng)該是布爾類型

回到正題,dp數(shù)組究竟代表什么意思

假設(shè)有一個長度為i的字符串s的子串,若dp[i] = true

那么dp[i]表示該字符串可以拆分為1個或多個字典wordDict中的單詞(可以理解為:dp[i]是對遍歷過程中某個子串是否能拆分為wordDict中單詞的一個認(rèn)證,true就是能拆,false就是拆不了)

2+3、確定遞推公式和初始化dp數(shù)組

這個遞推公式的條件可太多了,為什么連起來一塊說,看到后面就知道了

首先,因為我們要不斷遍歷字符串s并截取子串,通過查找子串是否存在于字典wordDict中來判斷當(dāng)前子串是否可以拆分

為什么要判斷子串是否可以拆分?

因為一旦遍歷完字符串s,那么此時的子串就是s本身了。進(jìn)而就可以求s能不能被拆分為字典wordDict中的單詞,這里體現(xiàn)了dp的思想,即前一輪遍歷的子串會影響下一輪的,最終影響整個結(jié)果

所以,第一個條件是:所遍歷區(qū)間內(nèi)的子串必須出現(xiàn)在字典中

在說第二個條件之前,有必要說一下 "不斷遍歷字符串s并截取子串" 的實現(xiàn)方式

其實就是雙指針

		for (int i = 1; i <= s.size(); i++) {   // 遍歷背包
            for (int j = 0; j < i; j++) {       // 遍歷物品
                string word = s.substr(j, i - j); //substr(起始位置,截取的個數(shù))
                if (wordSet.find(word) != wordSet.end() && dp[j]) {//這里wordSet是一個unordered_set
                    dp[i] = true;
                }
            }
        }

下面用圖來解釋一下遍歷過程

【LeetCode動態(tài)規(guī)劃#10】完全背包問題實戰(zhàn),其三(單詞拆分,涉及集合處理字符串)

上圖推導(dǎo)了兩層for循環(huán)的遍歷過程,其中,外層for循環(huán)負(fù)責(zé)遍歷字符串s(也就是所謂的背包),而內(nèi)層for則用來在[j,i]區(qū)間內(nèi)遍歷所有該區(qū)域內(nèi)的子串,用來在wordSet中查詢

如圖所示,當(dāng)外層for遍歷到 i = 4 ,才獲取到第一個能在wordSet中查詢到的子串"leet"

為什么不是在i = 3時得到? 因為substr函數(shù)截取子串的區(qū)間時左閉右開的,詳見 題外話

注意j遍歷截取區(qū)間[j,i]內(nèi)所有子串的順序:它是先截最長的(如圖所示)

此時,如果我們將dp[0]初始化為true

那么,每次i移動的時候,j重置為0,dp[j]就為true

若本次i移動到的位置,在j第一次獲取子串時就能獲取到目標(biāo)子串的話,其實就找到了一個滿足條件的子串

所以,此時的dp[i]也應(yīng)該為true

因此,第二個條件就是:[j, i] 這個區(qū)間的子串是否出現(xiàn)在字典里

綜上所述,本題的遞推公式是: if([j, i] 這個區(qū)間的子串出現(xiàn)在字典里 && dp[j]是true) 那么 dp[i] = true。(j < i )

初始化就是dp[0] = true(我認(rèn)為完全是為了代碼實現(xiàn)考慮,沒有別的含義),其余位置是false

4、確定遍歷順序

因為題目說了,字符串s中可能會有"一個或多個"能夠拆分為字典中單詞的子串,也就是說背包中可以放多個相同的物品(單詞),所以這是一個完全背包問題

而構(gòu)成子串必須按一定順序才能構(gòu)成字符串s,所以本題的完全背包求的是排序(排列有序組合無序)(排列組合的區(qū)別詳見)

所以遍歷順序是:先背包容量后物品

代碼

太繞了,終于到代碼了文章來源地址http://www.zghlxwxcb.cn/news/detail-419714.html

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        //定義dp數(shù)組
        vector<bool> dp(s.size() + 1, false);
        //初始化
        dp[0] = true;

        //遍歷dp數(shù)組
        //先將wordDict放入一個unordered_set便于使用子串進(jìn)行查找
        unordered_set<string> wordSet(wordDict.begin(), wordDict.end());

        for(int i = 1; i <= s.size(); ++i){//先遍歷背包,字符串s
            for(int j = 0; j < i; ++j){//再遍歷物品
                string word = s.substr(j, i - j);//使用j不斷截取區(qū)間內(nèi)的子串
                if(wordSet.find(word) != wordSet.end() && dp[j]) dp[i] = true;
            }
        }
        return dp[s.size()];
    }
};

到了這里,關(guān)于【LeetCode動態(tài)規(guī)劃#10】完全背包問題實戰(zhàn),其三(單詞拆分,涉及集合處理字符串)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 動態(tài)規(guī)劃-背包問題-完全背包

    對比01背包,完全背包中的每件物品有無數(shù)件。 也就是說,每件物品可以拿0,1,…,k,…件。 dp[i][j]表示前i種物品,體積為j時的最大價值 對于第i件物品: 不拿:dp[i][j]?dp[i-1][j] 拿一件:dp[i][j]?dp[i-1][j-w[i]]+v[i] 拿兩件:dp[i][j]?dp[i-1][j-2w[i]]+2v[i] … 拿k件:dp[i]][j]?dp[i

    2024年04月08日
    瀏覽(20)
  • 動態(tài)規(guī)劃之背包問題——完全背包

    算法相關(guān)數(shù)據(jù)結(jié)構(gòu)總結(jié): 序號 數(shù)據(jù)結(jié)構(gòu) 文章 1 動態(tài)規(guī)劃 動態(tài)規(guī)劃之背包問題——01背包 動態(tài)規(guī)劃之背包問題——完全背包 動態(tài)規(guī)劃之打家劫舍系列問題 動態(tài)規(guī)劃之股票買賣系列問題 動態(tài)規(guī)劃之子序列問題 算法(Java)——動態(tài)規(guī)劃 2 數(shù)組 算法分析之?dāng)?shù)組問題 3 鏈表 算法

    2024年02月03日
    瀏覽(25)
  • 完全背包&多重背包問題(動態(tài)規(guī)劃)

    完全背包問題: 每個物品使用次數(shù)沒有限制,與0-1背包的不同之處在于 遍歷背包的順序 是正序。 多重背包問題: 與完全背包的區(qū)別在于,每一種物品是有個數(shù)限制的,不能無限選擇。這篇博客講解的非常詳細(xì),可以參考學(xué)習(xí): 多重背包問題---超詳細(xì)講解+優(yōu)化(不懂你揍我

    2024年04月10日
    瀏覽(24)
  • 【LeetCode動態(tài)規(guī)劃#07】01背包問題一維寫法(狀態(tài)壓縮)實戰(zhàn),其二(目標(biāo)和、零一和)

    【LeetCode動態(tài)規(guī)劃#07】01背包問題一維寫法(狀態(tài)壓縮)實戰(zhàn),其二(目標(biāo)和、零一和)

    力扣題目鏈接(opens new window) 難度:中等 給定一個非負(fù)整數(shù)數(shù)組,a1, a2, ..., an, 和一個目標(biāo)數(shù),S。現(xiàn)在你有兩個符號 + 和 -。對于數(shù)組中的任意一個整數(shù),你都可以從 + 或 -中選擇一個符號添加在前面。 返回可以使最終數(shù)組和為目標(biāo)數(shù) S 的所有添加符號的方法數(shù)。 示例: 輸入

    2023年04月18日
    瀏覽(87)
  • 【動態(tài)規(guī)劃之完全背包問題】完全背包問題的通用解法與優(yōu)化

    【動態(tài)規(guī)劃之完全背包問題】完全背包問題的通用解法與優(yōu)化

    ?? 前面的話 ?? 本篇文章將介紹動態(tài)規(guī)劃中的背包問題——完全背包問題,前面我們已經(jīng)介紹了0-1背包問題,其實完全背包問題就只改了0-1背包問題的一個條件,即物品可選擇次數(shù)由一次改為無數(shù)次,僅此而已,下面我們就來開始介紹完全背包問題。 ??博客主頁:未見

    2023年04月22日
    瀏覽(114)
  • 動態(tài)規(guī)劃:完全背包問題

    動態(tài)規(guī)劃:完全背包問題

    ACwing #3. 完全背包問題 完全背包問題和01背包問題很相似。 01背包問題每個物品只能選一個,而完全背包問題每個物品可以選無限次。 DP問題的關(guān)鍵是找到狀態(tài)轉(zhuǎn)移方程: ①定義f[i][j]表示從前 i 個物品中選擇,體積為 j 的時候的最大價值。 ②那么轉(zhuǎn)移方程f[i][j] = max(f[i - 1][j

    2023年04月19日
    瀏覽(25)
  • 動態(tài)規(guī)劃——完全背包問題

    動態(tài)規(guī)劃——完全背包問題

    由于本人實力尚淺,接觸算法沒多久,寫這篇blog僅僅是想要提升自己對算法的理解,如果各位讀者發(fā)現(xiàn)什么錯誤,懇請指正,希望和大家一起進(jìn)步。(●’?’●) 了解完全背包問題前可以先去看看01背包問題(良心正解),先了解這個基礎(chǔ)問題會更有利于你了解下面的完全背

    2024年02月04日
    瀏覽(29)
  • 算法系列--動態(tài)規(guī)劃--背包問題(3)--完全背包介紹

    算法系列--動態(tài)規(guī)劃--背包問題(3)--完全背包介紹

    ??\\\"Su7\\\"?? 作者:Lvzi 文章主要內(nèi)容:算法系列–動態(tài)規(guī)劃–背包問題(3)–完全背包介紹 大家好,今天為大家?guī)淼氖?算法系列--動態(tài)規(guī)劃--背包問題(3)--完全背包介紹 鏈接: 完全背包 可以發(fā)現(xiàn)完全背包問題和01背包問題還是特比相似的 分析: 完全背包問題 是 01背包問題 的推廣

    2024年04月25日
    瀏覽(27)
  • 動態(tài)規(guī)劃完全背包問題-java

    動態(tài)規(guī)劃完全背包問題-java

    完全背包問題跟01背包問題思路大致一樣,只不過對于物品的拿取次數(shù)不在限制,我們只需要考慮這點即可。 文章目錄 前言 一、什么是完全背包問題? 二、問題模擬 1.樣例數(shù)據(jù) 2.算法思路 三、代碼如下 1.代碼如下(示例): 2.讀入數(shù) 3.代碼運行結(jié)果 總結(jié) 完全背包問題跟

    2024年04月26日
    瀏覽(24)
  • 動態(tài)規(guī)劃-----背包類問題(0-1背包與完全背包)詳解

    動態(tài)規(guī)劃-----背包類問題(0-1背包與完全背包)詳解

    目錄 什么是背包問題? 動態(tài)規(guī)劃問題的一般解決辦法: 0-1背包問題: 0 - 1背包類問題? 分割等和子集:? 完全背包問題:? 完全背包類問題 零錢兌換II: 背包問題(Knapsack problem)是一種組合優(yōu)化的NP完全問題。 問題可以描述為:給定一組物品,每種物品都有自己的重量和價格

    2024年04月17日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包