1. 程式人生 > >[C++] LeetCode 132. 分割回文串 II

[C++] LeetCode 132. 分割回文串 II

題目

給定一個字串 s,將 s 分割成一些子串,使每個子串都是迴文串。
返回 s 符合要求的的最少分割次數。
例如,給出 s = "aab",
返回 1 因為進行一次分割可以將字串 s 分割成 ["aa","b"] 這樣兩個迴文子串。

題解

這題有兩種解法,但是都是採用動態規劃。陣列nums[i]表示前i字串最小的分割次數,那麼在遍歷過程中需要知道ji的字串是否為迴文串。

方法一

先用動態規劃,用一個二維陣列flag[i][j]表示字串第j個到第i個是否為迴文串。然後再用一次動態規劃,得出最小分割次數。但是時間複雜度較高。
程式碼如下:

class Solution {
public:
    int
minCut(string s) { if(s.size()==0) return 0; int len=s.size(); vector<vector<bool>> flag(len,vector<bool>(len,false)); for(int k=0;k<len;k++){ for(int i=0,j=k;j<len;i++,j++){ if(i==j) flag[i][j]=true; else
if(s[i]==s[j]){ if(i==j-1) flag[i][j]=true; else if(flag[i+1][j-1]) flag[i][j]=true; else flag[i][j]=false; } else{ flag[i][j]=false; } } } vector<
int> nums(len,len-1); nums[0]=0; for(int i=1;i<len;i++){ if(flag[0][i]==true){ nums[i]=0; continue; } for(int j=i-1;j>=0;j--){ if(flag[j+1][i]==false) continue; nums[i]=min(nums[i],nums[j]+1); if(nums[i]==1) break; } } return nums[len-1]; } };

方法二

這種方法是以一個字元為中心,向兩邊擴充套件,如果是迴文串就更新最小分割次數,但是迴文串可能是偶數個,也可能是奇數個。所以需要考慮以當前字元為中心,或者以當前字元以及當前字元下一個字元共同為中心,進行兩邊擴充套件。如果為迴文串,則更新最小分割數,注意這裡不是個更新中心點的位置,而是迴文串末尾的位置。
假設vector<int> nums(len+1,0)表示字串的位置i(索引從1開始)的最小切割次數,ji區間子串為迴文串,那麼nums[i+1]=min(nums[i+1],nums[j]+1)
例如 s=adcbc
b為中心擴充套件的時候可以得到cbc為迴文串,那麼此時切割數最小就是ab最小的切割數+1,即nums[5]=min(nums[5],nums[2]+1)
程式碼如下:

class Solution {
public:
    int minCut(string s) {
        if(s.size()==0) return 0;
        int len=s.size();
        vector<int> nums(len+1,0);
        for(int i=0;i<=len;i++) nums[i]=i-1;
        for(int i=1;i<=len;i++){
            for(int j=0;j<i&&i+j<=len&&s[i-j-1]==s[i+j-1];j++){
                nums[i+j]=min(nums[i+j],nums[i-j-1]+1);
            }
            for(int j=0;i-j>0&&i+j+1<=len&&s[i-1]==s[i]&&s[i-j-1]==s[i+j];j++){
                nums[i+j+1]=min(nums[i+j+1],nums[i-j-1]+1);
            }
        }
        return nums[len];
    }
};

相關推薦

[C++] LeetCode 132. 分割 II

題目 給定一個字串 s,將 s 分割成一些子串,使每個子串都是迴文串。 返回 s 符合要求的的最少分割次數。 例如,給出 s = "aab", 返回 1 因為進行一次分割可以將字串 s 分割成 ["aa","b"] 這樣兩個迴文子串。 題解 這題有兩種解法,但是

LeetCode 132. 分割 II(Palindrome Partitioning II

題目描述   給定一個字串 s,將 s 分割成一些子串,使每個子串都是迴文串。 返回符合要求的最少分割次數。 示例: 輸入: "aab" 輸出: 1 解釋: 進行一次分割就可將 s 分割成 ["aa","b"] 這樣兩個迴文子串。 &nb

LeetCode-132.分割 II(相關話題:動態規劃)

給定一個字串 s,將 s 分割成一些子串,使每個子串都是迴文串。 返回符合要求的最少分割次數。 示例: 輸入: "aab" 輸出: 1 解釋: 進行一次分割就可將 s 分割成 ["aa","b"] 這樣兩個迴文子串。 思路: 從後往前處理: boolean[][] f,

LeetCode132. 分割 II 結題報告 (C++)

題目描述: 給定一個字串 s,將 s 分割成一些子串,使每個子串都是迴文串。 返回符合要求的最少分割次數。 示例: 輸入: "aab" 輸出: 1 解釋: 進行一次分割就可將 s 分割成 ["aa","b"] 這樣兩個迴文子串。 解題方案: 動態規劃的題目

LeetCode】#132分割II(Palindrome Partitioning II)

【LeetCode】#132分割回文串II(Palindrome Partitioning II) 題目描述 給定一個字串 s,將 s 分割成一些子串,使每個子串都是迴文串。 返回符合要求的最少分割次數。 示例 輸入: “aab” 輸出: 1 解釋: 進行一次分割就可將 s

Leetcode 132分割 II(最詳細的解法!!!)

給定一個字串 s,將 s 分割成一些子串,使每個子串都是迴文串。 返回符合要求的最少分割次數。 示例: 輸入: "aab" 輸出: 1 解釋: 進行一次分割就可將 s 分割成 ["aa","b"] 這樣兩個迴文子串。 解題思路 這個問題是之前問題的提高?Leetco

LeetCode 132.Palindrome Partitioning II (分割 II)

題目描述: 給定一個字串 s,將 s 分割成一些子串,使每個子串都是迴文串。 返回符合要求的最少分割次數。 示例: 輸入: "aab" 輸出: 1 解釋: 進行一次分割就可將 s 分割成 ["aa","b"] 這樣兩個迴文子串。 AC C++ Solution:

132 Palindrome Partitioning II 分割 II

回文 回文串 tco ++ ali 例如 post 字符 code 給定一個字符串 s,將 s 分割成一些子串,使每個子串都是回文串。返回 s 符合要求的的最少分割次數。例如,給出 s = "aab",返回 1 因為進行一次分割可以將字符串 s 分割成 ["aa","b"]

分割 II · Palindrome Partitioning II

class nbsp 英文 長度 總結 正常 bsp 風格 思路 [抄題]: 給定一個字符串s,將s分割成一些子串,使每個子串都是回文。 返回s符合要求的的最少分割次數。 [思維問題]: [一句話思路]: [輸入量]:空: 正常情況:特大:特小:程序裏處理到的特殊情況:異常

LeetCode 131. 分割(Palindrome Partitioning)

題目描述   給定一個字串 s,將 s 分割成一些子串,使每個子串都是迴文串。 返回 s 所有可能的分割方案。 示例: 輸入: "aab" 輸出: [ ["aa","b"], ["a","a","b"] ]  

LeetCode-131.分割(相關話題:動態規劃、深度優先)

給定一個字串 s,將 s 分割成一些子串,使每個子串都是迴文串。 返回 s 所有可能的分割方案。 示例: 輸入: "aab" 輸出: [ ["aa","b"], ["a","a","b"] ] 思路: 動態規劃判s[i~j]是否為迴文串 深度優先搜尋所

[和小菜雞一起刷題(python)] LeetCode 131. 分割 (Palindrome Partitioning)

LeetCode 131. 分割回文串 (Palindrome Partitioning) 原題 思路 程式碼 原題 給定一個字串 s,將 s 分割成一些子串,使每個子串都是迴文串。 返回 s 所有可能的分割方案。 示例:

lintode(108)分割 II

描述: 給定一個字串s,將s分割成一些子串,使每個子串都是迴文。 返回s符合要求的的最少分割次數。 樣例: 比如,給出字串s = "aab", 返回 1, 因為進行一次分割可以將字串s分割成["aa","b"]這樣兩個迴文子串 思路: eg:aabbaac 首先

分割II

給定一個字串s,將s分割成一些子串,使每個子串都是迴文。 返回s符合要求的的最少分割次數。 樣例 比如,給出字串s = "aab", 返回 1, 因為進行一次分割可以將字串s分割成["aa","b"]

lintcode練習-108. 分割 II

108. 分割回文串 II 給定一個字串s,將s分割成一些子串,使每個子串都是迴文。 返回s符合要求的的最少分割次數。 樣例 比如,給出字串s = "aab", 返回 1, 因為進行一次分割可

LeetCode】1131. 分割 結題報告 (C++)

題目描述: 給定一個字串 s,將 s 分割成一些子串,使每個子串都是迴文串。 返回 s 所有可能的分割方案。 示例: 輸入: "aab" 輸出: [   ["aa","b"],   ["a","a","b"] ] 解題方案: 本題是回溯法的題目,回溯法總是

LeetCode】#131分割(Palindrome Partitioning)

【LeetCode】#131分割回文串(Palindrome Partitioning) 題目描述 給定一個字串 s,將 s 分割成一些子串,使每個子串都是迴文串。 返回 s 所有可能的分割方案。 示例 輸入: “aab” 輸出: [ [“aa”,“b”], [“a”,“a”

Leetcode 131:分割(最詳細的解法!!!)

給定一個字串 s,將 s 分割成一些子串,使每個子串都是迴文串。 返回 s 所有可能的分割方案。 示例: 輸入: "aab" 輸出: [ ["aa","b"], ["a","a","b"] ] 解題思路 這個問題和前面的 Leetcode 93:復原IP地址

LeetCode 中等題】61-分割

題目描述:給定一個字串 s,將 s 分割成一些子串,使每個子串都是迴文串。返回 s 所有可能的分割方案。 示例: 輸入: "aab" 輸出: [ ["aa","b"], ["a","a","b"] ] 解

分割 · Palindrome Partitioning

nbsp space 特殊情況 clas 結束 ali rom 位置 函數 [抄題]: 給定一個字符串s,將s分割成一些子串,使每個子串都是回文串。 返回s所有可能的回文串分割方案。 給出 s = "aab",返回 [ ["aa", "b"], ["a", "a",