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

leetCode 131.分割回文串 + 動(dòng)態(tài)規(guī)劃 + 回溯算法 + 優(yōu)化 + 圖解 + 筆記

這篇具有很好參考價(jià)值的文章主要介紹了leetCode 131.分割回文串 + 動(dòng)態(tài)規(guī)劃 + 回溯算法 + 優(yōu)化 + 圖解 + 筆記。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

我的往期文章:

leetCode 647.回文子串 動(dòng)態(tài)規(guī)劃 + 優(yōu)化空間 / 中心擴(kuò)展法 + 雙指針-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/133883091?spm=1001.2014.3001.5501leetCode 131.分割回文串 + 回溯算法 + 圖解 + 筆記-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/134700907?spm=1001.2014.3001.5501(一)利用動(dòng)態(tài)規(guī)劃來(lái)優(yōu)化判斷回文子串

  • 利用動(dòng)態(tài)規(guī)劃高效地事先一次性計(jì)算出, 針對(duì)一個(gè)字符串s, 它的任何子串是否是回文字串, 然后在我們的回溯函數(shù)中直接查詢即可, 省去了雙指針移動(dòng)判定這一步驟.(來(lái)自代碼隨想錄Carl老師的原話)原文鏈接:代碼隨想錄 (programmercarl.com)

>>思路和分析

回文子串:講究的是這個(gè)字符串里邊左右兩邊是對(duì)稱的,左右兩邊的元素是相同的。如果只判斷這個(gè)字符串的最左面和最右面這兩個(gè)元素相同的情況下,還知道中間的子串已經(jīng)是回文的,那么就可以直接判斷整個(gè)字符串它就是回文子串。

leetCode 131.分割回文串 + 動(dòng)態(tài)規(guī)劃 + 回溯算法 + 優(yōu)化 + 圖解 + 筆記,回溯算法,動(dòng)態(tài)規(guī)劃,算法,leetcode,筆記,回溯算法,動(dòng)態(tài)規(guī)劃,優(yōu)化,圖解

也就是說,如果在[i+1,j-1]范圍的子串是一個(gè)回文串,再向兩邊拓展遍歷的時(shí)候,那只需要判斷兩邊這兩個(gè)元素是否相同就可以了。若相同,dp[i][j]是回文串。

>>動(dòng)規(guī)五部曲

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

  • dp[i][j]:表示區(qū)間范圍[i,j]的子串是否為回文子串。如果是,則dp[i][j] = true,否則為false
  • 或者說,dp[i][j] 表示截取從 i 到 j 的子串是否為回文子串

2.確定遞推式

if(j == i) dp[i][j]=true;
else if(j-i == 1) dp[i][j] = (s[i]==s[j]);
else dp[i][j] = (s[i] == s[j] && dp[i+1][j-1]);

3.dp 數(shù)組初始化

  • dp[i][j]初始化為false

4.確定遍歷順序

一定要從下到上,從左到右遍歷,這樣能保證dp[i+1][j-1]是經(jīng)過計(jì)算得來(lái)的

leetCode 131.分割回文串 + 動(dòng)態(tài)規(guī)劃 + 回溯算法 + 優(yōu)化 + 圖解 + 筆記,回溯算法,動(dòng)態(tài)規(guī)劃,算法,leetcode,筆記,回溯算法,動(dòng)態(tài)規(guī)劃,優(yōu)化,圖解

?5.舉例推導(dǎo)dp數(shù)組leetCode 131.分割回文串 + 動(dòng)態(tài)規(guī)劃 + 回溯算法 + 優(yōu)化 + 圖解 + 筆記,回溯算法,動(dòng)態(tài)規(guī)劃,算法,leetcode,筆記,回溯算法,動(dòng)態(tài)規(guī)劃,優(yōu)化,圖解

void computePalindrome(const string& s) {
    // dp[i][j] 代表s[i:j](雙邊包括)是否是回文子串
    dp.resize(s.size(),vector<bool>(s.size(),false));// 根據(jù)字符串s,刷新布爾矩陣的大小
    for(int i=s.size()-1;i>=0;i--) {
        // 需要倒序計(jì)算,保證在i行時(shí),i+1行已經(jīng)計(jì)算好了
        for(int j=i;j<s.size();j++) {
            if(j == i) dp[i][j]=true;
            else if(j-i == 1) dp[i][j] = (s[i]==s[j]);
            else dp[i][j] = (s[i] == s[j] && dp[i+1][j-1]);
        }
    }
}
"aebeaeccfcce"
1  0  0  0  1  0  0  0  0  0  0  0  
0  1  0  1  0  0  0  0  0  0  0  0  
0  0  1  0  0  0  0  0  0  0  0  0  
0  0  0  1  0  1  0  0  0  0  0  0  
0  0  0  0  1  0  0  0  0  0  0  0  
0  0  0  0  0  1  0  0  0  0  0  1  
0  0  0  0  0  0  1  1  0  0  1  0  
0  0  0  0  0  0  0  1  0  1  0  0  
0  0  0  0  0  0  0  0  1  0  0  0  
0  0  0  0  0  0  0  0  0  1  1  0  
0  0  0  0  0  0  0  0  0  0  1  0  
0  0  0  0  0  0  0  0  0  0  0  1  


"acgcabbfcc"
1  0  0  0  1  0  0  0  0  0  
0  1  0  1  0  0  0  0  0  0  
0  0  1  0  0  0  0  0  0  0  
0  0  0  1  0  0  0  0  0  0  
0  0  0  0  1  0  0  0  0  0  
0  0  0  0  0  1  1  0  0  0  
0  0  0  0  0  0  1  0  0  0  
0  0  0  0  0  0  0  1  0  0  
0  0  0  0  0  0  0  0  1  1  
0  0  0  0  0  0  0  0  0  1  

(二)分割回文串 + 動(dòng)態(tài)規(guī)劃 + 回溯算法 + 優(yōu)化

class Solution {
public:
    vector<vector<string>> result;
    vector<string> path; // 放已經(jīng)回文的子串
    vector<vector<bool>> dp; // 放事先計(jì)算好的是否回文子串的結(jié)果
    void backtracking(const string& s,int startIndex) {
        // 如果起始位置已經(jīng)大于 s 的大小,說明已經(jīng)找到了一組分割方案了
        if(startIndex >= s.size()) {
            result.push_back(path);
            return;
        }
        for(int i=startIndex;i<s.size();i++) {
            if(dp[startIndex][i]) { // 是回文子串
                // 獲取[startIndex,i] 在 s 中的子串
                string subStr = s.substr(startIndex,i-startIndex+1);
                path.push_back(subStr);
            }else continue; // 不是回文,跳過
            backtracking(s,i+1);// 尋找 i+1 為起始位置的子串
            path.pop_back();// 回溯過程,彈出本次已經(jīng)添加的子串
        }
    }
    void computePalindrome(const string& s) {
        // dp[i][j] 代表s[i:j](雙邊包括)是否是回文子串
        dp.resize(s.size(),vector<bool>(s.size(),false));// 根據(jù)字符串s,刷新布爾矩陣的大小
        for(int i=s.size()-1;i>=0;i--) {
            // 需要倒序計(jì)算,保證在i行時(shí),i+1行已經(jīng)計(jì)算好了
            for(int j=i;j<s.size();j++) {
                if(j == i) dp[i][j]=true;
                else if(j-i == 1) dp[i][j] = (s[i]==s[j]);
                else dp[i][j] = (s[i] == s[j] && dp[i+1][j-1]);
            }
        }
    }
    vector<vector<string>> partition(string s) {
        computePalindrome(s);
        backtracking(s, 0);
        return result;
    }
};

參考和推薦文章:

代碼隨想錄 (programmercarl.com)https://www.programmercarl.com/0131.%E5%88%86%E5%89%B2%E5%9B%9E%E6%96%87%E4%B8%B2.html#%E6%80%9D%E8%B7%AF

摘選代碼隨想錄的總結(jié):

  • 總結(jié)難點(diǎn):
  1. 如何切割?切割問題可以抽象為組合問題
  2. 如何模擬那些切割線?
  3. 切割問題中遞歸如何終止?
  4. 在遞歸循環(huán)中如何截取子串?
  5. 如何判斷回文?

遞歸用于縱向遍歷,for循環(huán)用于橫向遍歷當(dāng)切割線迭代至字符串末尾,說明找到一種方法。類似組合問題,為了不重復(fù)切割同一位置,利用?start_index?作為標(biāo)記,記錄下一輪。遞歸的起始位置(切割線)。切割過的地方不能重復(fù)切割,故遞歸函數(shù)傳入 i+1文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-753521.html

到了這里,關(guān)于leetCode 131.分割回文串 + 動(dòng)態(tài)規(guī)劃 + 回溯算法 + 優(yōu)化 + 圖解 + 筆記的文章就介紹完了。如果您還想了解更多內(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)文章

  • 【刷題1】LeetCode 131. 分割回文串 java題解

    2024: 剛開始做leetcode hot100,查閱自己以前寫的題解專欄,發(fā)現(xiàn)沒有這一題,于是加上??赡躭eetcode100更新了吧。我看現(xiàn)在leetcode100官網(wǎng)的題目已經(jīng)是分好類的了,以前我的題解帖子是自己手動(dòng)分類整理的。

    2024年02月19日
    瀏覽(19)
  • (動(dòng)態(tài)規(guī)劃) 132. 分割回文串 II ——【Leetcode每日一題】

    (動(dòng)態(tài)規(guī)劃) 132. 分割回文串 II ——【Leetcode每日一題】

    難度:困難 給你一個(gè)字符串 s ,請(qǐng)你將 s 分割成一些子串,使每個(gè)子串都是回文。 返回符合要求的 最少分割次數(shù) 。 示例 1: 輸入:s = “aab” 輸出:1 解釋:只需一次分割就可將 s 分割成 [“aa”,“b”] 這樣兩個(gè)回文子串。 示例 2: 輸入:s = “a” 輸出:0 示例 3: 輸入:

    2024年02月15日
    瀏覽(43)
  • 【算法|動(dòng)態(tài)規(guī)劃No30】leetcode5. 最長(zhǎng)回文子串

    【算法|動(dòng)態(tài)規(guī)劃No30】leetcode5. 最長(zhǎng)回文子串

    個(gè)人主頁(yè):兜里有顆棉花糖 歡迎 點(diǎn)贊?? 收藏? 留言? 加關(guān)注??本文由 兜里有顆棉花糖 原創(chuàng) 收錄于專欄【手撕算法系列專欄】【LeetCode】 ??本專欄旨在提高自己算法能力的同時(shí),記錄一下自己的學(xué)習(xí)過程,希望對(duì)大家有所幫助 ??希望我們一起努力、成長(zhǎng),共同進(jìn)步。

    2024年02月08日
    瀏覽(24)
  • 算法打卡day49|動(dòng)態(tài)規(guī)劃篇17| Leetcode 647. 回文子串、516.最長(zhǎng)回文子序列

    算法打卡day49|動(dòng)態(tài)規(guī)劃篇17| Leetcode 647. 回文子串、516.最長(zhǎng)回文子序列

    Leetcode 647. 回文子串 題目鏈接:647. 回文子串 大佬視頻講解:647. 回文子串視頻講解 ?個(gè)人思路? 這道題的dp數(shù)組有點(diǎn)難找到關(guān)聯(lián),以至于遞歸關(guān)系也不好找,所以看題解吧... 解法 動(dòng)態(tài)規(guī)劃 動(dòng)規(guī)五部曲: 1.確定dp數(shù)組(dp table)以及下標(biāo)的含義 一般在定義dp數(shù)組的時(shí)候 會(huì)根據(jù)題

    2024年04月22日
    瀏覽(30)
  • 【算法|動(dòng)態(tài)規(guī)劃No.28】leetcode1312. 讓字符串成為回文串的最少插入次數(shù)

    【算法|動(dòng)態(tài)規(guī)劃No.28】leetcode1312. 讓字符串成為回文串的最少插入次數(shù)

    個(gè)人主頁(yè):兜里有顆棉花糖 歡迎 點(diǎn)贊?? 收藏? 留言? 加關(guān)注??本文由 兜里有顆棉花糖 原創(chuàng) 收錄于專欄【手撕算法系列專欄】【LeetCode】 ??本專欄旨在提高自己算法能力的同時(shí),記錄一下自己的學(xué)習(xí)過程,希望對(duì)大家有所幫助 ??希望我們一起努力、成長(zhǎng),共同進(jìn)步。

    2024年02月06日
    瀏覽(22)
  • C++力扣題目131--分割回文串

    C++力扣題目131--分割回文串

    131. 分割回文串 給你一個(gè)字符串? s ,請(qǐng)你將 ? s ? 分割成一些子串,使每個(gè)子串都是? 回文串 ?。返回? s ?所有可能的分割方案。 回文串 ?是正著讀和反著讀都一樣的字符串。 示例 1: 示例 2: 提示: 1 = s.length = 16 s ?僅由小寫英文字母組成 本題這涉及到兩個(gè)關(guān)鍵問題:

    2024年01月20日
    瀏覽(16)
  • 動(dòng)態(tài)規(guī)劃-分割回文串 II

    動(dòng)態(tài)規(guī)劃-分割回文串 II

    跟著九章侯老師學(xué)習(xí)了動(dòng)態(tài)規(guī)劃專題之后根據(jù)學(xué)習(xí)所總結(jié): 給你一個(gè)字符串 s,請(qǐng)你將 s 分割成一些子串,使每個(gè)子串都是回文。 返回符合要求的 最少分割次數(shù) 。 輸入:s = “aab” 輸出:1 解釋:只需一次分割就可將 s 分割成 [“aa”,“b”] 這樣兩個(gè)回文子串。 輸入:s = “

    2024年02月10日
    瀏覽(15)
  • 【動(dòng)態(tài)規(guī)劃】【字符串】132.分割回文串 II

    【動(dòng)態(tài)規(guī)劃】【字符串】132.分割回文串 II

    視頻算法專題 動(dòng)態(tài)規(guī)劃匯總 字符串 給你一個(gè)字符串 s,請(qǐng)你將 s 分割成一些子串,使每個(gè)子串都是回文。 返回符合要求的 最少分割次數(shù) 。 示例 1: 輸入:s = “aab” 輸出:1 解釋:只需一次分割就可將 s 分割成 [“aa”,“b”] 這樣兩個(gè)回文子串。 示例 2: 輸入:s = “a”

    2024年02月03日
    瀏覽(31)
  • 【力扣】416. 分割等和子集 <動(dòng)態(tài)規(guī)劃、回溯>

    【力扣】416. 分割等和子集 <動(dòng)態(tài)規(guī)劃、回溯>

    給你一個(gè) 只包含正整數(shù)的非空數(shù)組 nums 。請(qǐng)你判斷是否可以將這個(gè)數(shù)組分割成兩個(gè)子集,使得兩個(gè)子集的元素和相等。 示例 1: 輸入:nums = [1,5,11,5] 輸出:true 解釋:數(shù)組可以分割成 [1, 5, 5] 和 [11] 。 示例 2: 輸入:nums = [1,2,3,5] 輸出:false 解釋:數(shù)組不能分割成兩個(gè)元素和

    2024年02月10日
    瀏覽(18)
  • day27 | 39. 組合總和、 40.組合總和II、131.分割回文串

    目錄: 39.?組合總和 給你一個(gè)? 無(wú)重復(fù)元素 ?的整數(shù)數(shù)組? candidates ?和一個(gè)目標(biāo)整數(shù)? target ?,找出? candidates ?中可以使數(shù)字和為目標(biāo)數(shù)? target ?的 所有?** 不同組合 ?,并以列表形式返回。你可以按? 任意順序 ?返回這些組合。 candidates ?中的? 同一個(gè) ?數(shù)字可以? 無(wú)限

    2024年02月10日
    瀏覽(17)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包