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

D47|動(dòng)態(tài)規(guī)劃-子序列part2

這篇具有很好參考價(jià)值的文章主要介紹了D47|動(dòng)態(tài)規(guī)劃-子序列part2。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

392.判斷子序列:

初始思路:

????????D47|動(dòng)態(tài)規(guī)劃-子序列part2,動(dòng)態(tài)規(guī)劃,哈希算法,算法D47|動(dòng)態(tài)規(guī)劃-子序列part2,動(dòng)態(tài)規(guī)劃,哈希算法,算法

????????左為判斷公共子序列,右為判斷子序列,感覺(jué)代碼完全可以套用,如果公共子序列的長(zhǎng)度是較短的字符串的長(zhǎng)度的話即輸出true,如果不是即輸出false。

class Solution {
    public boolean isSubsequence(String s, String t) {
        if(s.length()==0&&t.length()==0){return true;}
        if(t.length()==0){return false;}
        char[] sc = s.toCharArray();
        char[] tc = t.toCharArray();
        int length = sc.length<tc.length?sc.length:tc.length;
        int[][] dp = new int[sc.length+1][tc.length+1];
        int result = 0;
        for(int i = 1;i<sc.length+1;i++){
            for(int j = 1;j<tc.length+1;j++){
                if(sc[i-1]==tc[j-1]){
                    dp[i][j] = dp[i-1][j-1]+1;
                }else{
                    dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);
                }
                result = Math.max(result,dp[i][j]);
            }
        }
        if(result==length){return true;}
        return false;
    }
}

題解復(fù)盤(pán):?

? ? ? ? 完全不一樣的思路,一個(gè)新的操縱方法:編輯距離!

動(dòng)態(tài)規(guī)劃五部曲:

1)確定dp數(shù)組(dp table)以及下標(biāo)的含義:

dp[i][j] 表示以下標(biāo)i-1為結(jié)尾的字符串s,和以下標(biāo)j-1為結(jié)尾的字符串t,相同子序列的長(zhǎng)度為dp[i][j]

2)確定遞推公式:

if (s[i - 1] == t[j - 1]),那么dp[i][j] = dp[i - 1][j - 1] + 1;,因?yàn)檎业搅艘粋€(gè)相同的字符,相同子序列長(zhǎng)度自然要在dp[i-1][j-1]的基礎(chǔ)上加1(如果不理解,在回看一下dp[i][j]的定義

if (s[i - 1] != t[j - 1]),此時(shí)相當(dāng)于t要?jiǎng)h除元素,t如果把當(dāng)前元素t[j - 1]刪除,那么dp[i][j] 的數(shù)值就是 看s[i - 1]與 t[j - 2]的比較結(jié)果了,即:dp[i][j] = dp[i][j - 1]

class Solution {
    public boolean isSubsequence(String s, String t) {
        int length1 = s.length(); int length2 = t.length();
        int[][] dp = new int[length1+1][length2+1];
        for(int i = 1; i <= length1; i++){
            for(int j = 1; j <= length2; j++){
                if(s.charAt(i-1) == t.charAt(j-1)){
                    dp[i][j] = dp[i-1][j-1] + 1;
                }else{
                    dp[i][j] = dp[i][j-1];
                }
            }
        }
        if(dp[length1][length2] == length1){
            return true;
        }else{
            return false;
        }
    }
}

?115.不同的子序列:

初始思路&&題解復(fù)盤(pán):

動(dòng)態(tài)規(guī)劃五部曲;

1)dp[i][j]:以i-1為結(jié)尾的s子序列中出現(xiàn)以j-1為結(jié)尾的t的個(gè)數(shù)為dp[i][j]。

2)確定遞推公式:

  • s[i - 1] 與 t[j - 1]相等
  • s[i - 1] 與 t[j - 1] 不相等

當(dāng)s[i - 1] 與 t[j - 1]相等時(shí),dp[i][j]可以有兩部分組成。

1)一部分是用s[i - 1]來(lái)匹配,那么個(gè)數(shù)為dp[i - 1][j - 1]。即不需要考慮當(dāng)前s子串和t子串的最后一位字母,所以只需要 dp[i-1][j-1]。

2)一部分是不用s[i - 1]來(lái)匹配,個(gè)數(shù)為dp[i - 1][j]。

例如: s:baegg 和 t:bag ,s[4] 和 t[2]是相同的,但是字符串s也可以不用s43]來(lái)匹配,即用s[0]s[1]s[3]組成的bag。

當(dāng)然也可以用s[4]來(lái)匹配,即:s[0]s[1]s[4]組成的bag。

當(dāng)s[i - 1] 與 t[j - 1]不相等時(shí),dp[i][j]只有一部分組成,不用s[i - 1]來(lái)匹配(就是模擬在s中刪除這個(gè)元素),即:dp[i - 1][j]

所以遞推公式為:dp[i][j] = dp[i - 1][j]

3)初始化:

從遞推公式dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]; 和 dp[i][j] = dp[i - 1][j]; 中可以看出dp[i][j] 是從上方和左上方推導(dǎo)而來(lái),如圖:,那么 dp[i][0] 和dp[0][j]是一定要初始化的。

D47|動(dòng)態(tài)規(guī)劃-子序列part2,動(dòng)態(tài)規(guī)劃,哈希算法,算法

每次當(dāng)初始化的時(shí)候,都要回顧一下dp[i][j]的定義,不要憑感覺(jué)初始化。

dp[i][0]表示什么呢?

dp[i][0] 表示:以i-1為結(jié)尾的s可以隨便刪除元素,出現(xiàn)空字符串的個(gè)數(shù)。

那么dp[i][0]一定都是1,因?yàn)橐簿褪前岩詉-1為結(jié)尾的s,刪除所有元素,出現(xiàn)空字符串的個(gè)數(shù)就是1。

再來(lái)看dp[0][j],dp[0][j]:空字符串s可以隨便刪除元素,出現(xiàn)以j-1為結(jié)尾的字符串t的個(gè)數(shù)(它都一直是空字符串了,那怎么能有元素咧?。?/span>。

那么dp[0][j]一定都是0,s如論如何也變成不了t。

最后就要看一個(gè)特殊位置了,即:dp[0][0] 應(yīng)該是多少。

dp[0][0]應(yīng)該是1,空字符串s,可以刪除0個(gè)元素,變成空字符串t。

4)遍歷順序

5)舉例:

?D47|動(dòng)態(tài)規(guī)劃-子序列part2,動(dòng)態(tài)規(guī)劃,哈希算法,算法

class Solution {
    public int numDistinct(String s, String t) {
        char[] sc = s.toCharArray();
        char[] st = t.toCharArray();
        int[][] dp = new int[sc.length+1][st.length+1];
        for(int i = 0;i<sc.length+1;i++){
            dp[i][0] = 1;
        }
        for(int i = 1;i<sc.length+1;i++){
            for(int j =1;j<st.length+1;j++){
                if(sc[i-1]==st[j-1]){
                    dp[i][j] = dp[i-1][j-1]+dp[i-1][j];
                }else{
                    dp[i][j] = dp[i-1][j];
                }
            }
        }
        return dp[sc.length][st.length];

    }
}

?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-788400.html

到了這里,關(guān)于D47|動(dòng)態(tài)規(guī)劃-子序列part2的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 劍指offer(C++)-JZ47:禮物的最大價(jià)值(算法-動(dòng)態(tài)規(guī)劃)

    劍指offer(C++)-JZ47:禮物的最大價(jià)值(算法-動(dòng)態(tài)規(guī)劃)

    作者:翟天保Steven 版權(quán)聲明:著作權(quán)歸作者所有,商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處 題目描述: 在一個(gè)mtimes nm×n的棋盤(pán)的每一格都放有一個(gè)禮物,每個(gè)禮物都有一定的價(jià)值(價(jià)值大于 0)。你可以從棋盤(pán)的左上角開(kāi)始拿格子里的禮物,并每次向右或者向

    2024年02月05日
    瀏覽(26)
  • 算法訓(xùn)練day49|動(dòng)態(tài)規(guī)劃part10

    貪心 因?yàn)楣善本唾I(mǎi)賣一次,那么貪心的想法很自然就是取最左最小值,取最右最大值,那么得到的差值就是最大利潤(rùn)。 本次重點(diǎn)學(xué)習(xí)動(dòng)態(tài)規(guī)劃方法 1. dp數(shù)組(dp table)以及下標(biāo)的含義 dp[i][0] 表示第i天持有股票所得最多現(xiàn)金,一開(kāi)始現(xiàn)金為負(fù)數(shù),所以第一天就持有股票的話,

    2024年02月03日
    瀏覽(49)
  • day52 算法訓(xùn)練|動(dòng)態(tài)規(guī)劃part13

    day52 算法訓(xùn)練|動(dòng)態(tài)規(guī)劃part13

    參考:代碼隨想錄 1. dp[i]的定義 本題中,正確定義dp數(shù)組的含義十分重要。 dp[i]表示i之前包括i的以nums[i]結(jié)尾的最長(zhǎng)遞增子序列的長(zhǎng)度 為什么一定表示 “以nums[i]結(jié)尾的最長(zhǎng)遞增子序” ,因?yàn)槲覀冊(cè)?做 遞增比較的時(shí)候, 如果比較 nums[j] 和 nums[i] 的大小,那么兩個(gè)遞增子序列

    2024年01月15日
    瀏覽(19)
  • day55 算法訓(xùn)練|動(dòng)態(tài)規(guī)劃part15

    day55 算法訓(xùn)練|動(dòng)態(tài)規(guī)劃part15

    給定字符串 s 和 t ,判斷 s 是否為 t 的子序列。 字符串的一個(gè)子序列是原始字符串刪除一些(也可以不刪除)字符而不改變剩余字符相對(duì)位置形成的新字符串。(例如,\\\"ace\\\"是\\\"abcde\\\"的一個(gè)子序列,而\\\"aec\\\"不是)。 其實(shí)就是最長(zhǎng)公共子序列的變種題:如果公共子序列長(zhǎng)度等于

    2024年02月02日
    瀏覽(25)
  • day48算法訓(xùn)練|動(dòng)態(tài)規(guī)劃part09

    day48算法訓(xùn)練|動(dòng)態(tài)規(guī)劃part09

    1. dp數(shù)組(dp table)以及下標(biāo)的含義 dp[i]:考慮下標(biāo)i(包括i)以內(nèi)的房屋,最多可以偷竊的金額為dp[i] 。 2.遞推公式 決定dp[i]的因素就是第i房間偷還是不偷。 如果偷第i房間,那么dp[i] = dp[i - 2] + nums[i] ,即:第i-1房一定是不考慮的,找出 下標(biāo)i-2(包括i-2)以內(nèi)的房屋,最多

    2024年01月16日
    瀏覽(22)
  • 代碼隨想錄算法訓(xùn)練51 | 動(dòng)態(tài)規(guī)劃part12

    本題加了一個(gè)冷凍期,狀態(tài)就多了,有點(diǎn)難度,大家要把各個(gè)狀態(tài)分清,思路才能清晰? 視頻講解: 動(dòng)態(tài)規(guī)劃來(lái)決定最佳時(shí)機(jī),這次有冷凍期!| LeetCode:309.買(mǎi)賣股票的最佳時(shí)機(jī)含冷凍期_嗶哩嗶哩_bilibili 代碼隨想錄 相對(duì)122.買(mǎi)賣股票的最佳時(shí)機(jī)II?,本題只需要在計(jì)算賣出操

    2024年01月18日
    瀏覽(51)
  • 算法:動(dòng)態(tài)規(guī)劃——最長(zhǎng)公共子序列

    算法:動(dòng)態(tài)規(guī)劃——最長(zhǎng)公共子序列

    動(dòng)態(tài)規(guī)劃算法與分治法類似,其基本思想也是將待求解問(wèn)題分解成若干個(gè)子問(wèn)題,先求解子問(wèn)題,然后從這些子問(wèn)題的解得到原問(wèn)題的解。 與分治法不同的是,適合于用動(dòng)態(tài)規(guī)劃法求解的問(wèn)題,經(jīng)分解得到的子問(wèn)題往往不是互相獨(dú)立的。若用分治法解這類問(wèn)題,則分解得到的

    2023年04月27日
    瀏覽(22)
  • 【算法-動(dòng)態(tài)規(guī)劃】最長(zhǎng)公共子序列

    【算法-動(dòng)態(tài)規(guī)劃】最長(zhǎng)公共子序列

    ??????歡迎來(lái)到我的博客,很高興能夠在這里和您見(jiàn)面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內(nèi)容和知識(shí),也可以暢所欲言、分享您的想法和見(jiàn)解。 推薦:kuan 的首頁(yè),持續(xù)學(xué)習(xí),不斷總結(jié),共同進(jìn)步,活到老學(xué)到老 導(dǎo)航 檀越劍指大廠系列:全面總

    2024年01月23日
    瀏覽(27)
  • 動(dòng)態(tài)規(guī)劃算法 | 最長(zhǎng)遞增子序列

    動(dòng)態(tài)規(guī)劃算法 | 最長(zhǎng)遞增子序列

    通過(guò)查閱相關(guān)資料 發(fā)現(xiàn)動(dòng)態(tài)規(guī)劃問(wèn)題一般就是求解最值問(wèn)題 。這種方法在解決一些問(wèn)題時(shí)應(yīng)用比較多,比如求最長(zhǎng)遞增子序列等。 有部分人認(rèn)為動(dòng)態(tài)規(guī)劃的核心就是:窮舉。因?yàn)橐笞钪担隙ㄒ阉锌尚械拇鸢父F舉出來(lái),然后在其中找最值。 首先,筆者認(rèn)為動(dòng)態(tài)規(guī)劃中

    2024年02月06日
    瀏覽(30)
  • 新星計(jì)劃Day6【數(shù)據(jù)結(jié)構(gòu)與算法】 鏈表Part2

    新星計(jì)劃Day6【數(shù)據(jù)結(jié)構(gòu)與算法】 鏈表Part2

    ?????博客主頁(yè):京與舊鋪的博客主頁(yè) ?歡迎關(guān)注??點(diǎn)贊??收藏?留言? ??本文由京與舊鋪原創(chuàng),csdn首發(fā)! ??系列專欄:java學(xué)習(xí) ??首發(fā)時(shí)間:??2022年4月30日?? ??你做三四月的事,八九月就會(huì)有答案,一起加油吧 ??如果覺(jué)得博主的文章還不錯(cuò)的話,請(qǐng)三連支持一

    2023年04月08日
    瀏覽(23)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包