[C++] LeetCode 132. 分割回文串 II
題目
給定一個字串 s,將 s 分割成一些子串,使每個子串都是迴文串。
返回 s 符合要求的的最少分割次數。
例如,給出 s = "aab"
,
返回 1
因為進行一次分割可以將字串 s 分割成 ["aa","b"]
這樣兩個迴文子串。
題解
這題有兩種解法,但是都是採用動態規劃。陣列nums[i]
表示前i
字串最小的分割次數,那麼在遍歷過程中需要知道j
至i
的字串是否為迴文串。
方法一
先用動態規劃,用一個二維陣列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
開始)的最小切割次數,j
到i
區間子串為迴文串,那麼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,
【LeetCode】132. 分割回文串 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",