LeetCode 分割回文串II(動態規劃)
給定一個字串 s,將 s 分割成一些子串,使每個子串都是迴文串。
返回符合要求的最少分割次數。
示例:
輸入: "aab"
輸出: 1
解釋: 進行一次分割就可將 s 分割成 ["aa","b"] 這樣兩個迴文子串。
請先翻閱 LeetCode 分割回文子串
此題就是在上一題將所有分割方法修改為最少的分割次數。
方法一:回溯法。繼續使用上一題的程式碼,只是在dfs函式中新增一個變數記錄分割的次數,並尋找到分割次數最少的分割方法。(但是超時了。。。)
class Solution {
public:
int minResult = INT_MAX;
int minCut(string s) {
if (s == "") {
return 0;
}
dfs(s, 0, 0);//開始搜尋
return minResult;
}
//從beginIndex開始,尋找回文子串
void dfs(string &str, int beginIndex, int steps) {
int strSize = str.size();
if (beginIndex == strSize) {//如果擷取到了尾端,說明尋找到了一個解
minResult = min(minResult, steps - 1);
return;
}
//對擷取長度進行窮舉
int endIndex = strSize - 1;
while (endIndex >= beginIndex) {
if (isPalindrome(str, beginIndex, endIndex)) {//如果當前擷取的[beginIndex, endIndex]段是迴文串
dfs(str, endIndex + 1, steps + 1);//以endIndex + 1下標為起始,繼續尋找
}
--endIndex;
}
}
//判斷在str串中擷取[beginIndex, endIndex]段是否是迴文串
bool isPalindrome(string &str, int beginIndex, int endIndex) {
while (beginIndex < endIndex) {
if (str[beginIndex++] != str[endIndex--]) {
return false;
}
}
return true;
}
};
方法二:動態規劃。
class Solution {
public:
int minCut(string s) {
if (s == "") {
return 0;
}
int strSize = s.size();
vector<vector<bool>> judge(strSize, vector<bool>(strSize, false));//judge[j][i]用於記錄s串[i,j]是否是迴文
vector<int> dp(strSize, INT_MAX);//dp[i]用於記錄s串中[0, i]需要分割的次數
for (int i = 0; i < strSize; ++i) {
for (int j = 0; j <= i; ++j) {//從[j, i]
if (s[i] == s[j] && (i - j <= 1 || judge[j + 1][i - 1])) {
judge[j][i] = true;
if (j != 0) {//如果j == 0,說明[0, i]都是迴文
//dp[j - 1] + 1 表示的分割[0, j - 1] + [j, i]需要分割的次數一個解
dp[i] = min(dp[i], dp[j - 1] + 1);
}
else {
dp[i] = 0;
}
}
}
}
return dp[strSize - 1];
}
};
相關文章
- leetcode------分割回文串LeetCode
- 【LeetCode刷題(困難程度)】132. 分割回文串 IILeetCode
- LeetCode-131-分割回文串LeetCode
- 分割回文串
- 回溯演算法 LeetCode 131 分割回文子串演算法LeetCode
- LeetCode 39. 組合總和 40.組合總和II 131.分割回文串LeetCode
- [leetcode] 動態規劃(Ⅰ)LeetCode動態規劃
- [LeetCode解題] -- 動態規劃二 [ 子串、子序列問題 ]LeetCode動態規劃
- [leetcode 1235] [動態規劃]LeetCode動態規劃
- leetcode題解(動態規劃)LeetCode動態規劃
- leetcode總結——動態規劃LeetCode動態規劃
- 動態規劃——字串分割(Word Break)動態規劃字串
- leetcode-動態規劃總結LeetCode動態規劃
- [動態規劃] 六、最長迴文子串動態規劃
- 【圖解動態規劃】打家劫舍 II(四種解法)圖解動態規劃
- Leetcode 編輯距離(動態規劃)LeetCode動態規劃
- LeetCode 動態規劃 House Robber 習題LeetCode動態規劃
- [LeetCode] 動態規劃題型總結LeetCode動態規劃
- 【leetcode】741 摘櫻桃(動態規劃)LeetCode動態規劃
- Day 26| 39. 組合總和 、 40.組合總和II 、 131.分割回文串
- SYZOJ - 補充構造迴文串(動態規劃)動態規劃
- 迴文串問題(動態規劃DP C++)動態規劃C++
- leetcod 131.分割回文串(回溯、迴文字串)字串
- LeetCode:動態規劃+貪心題目整理LeetCode動態規劃
- LeetCode入門指南 之 動態規劃思想LeetCode動態規劃
- LeetCode 343. 整數拆分--動態規劃LeetCode動態規劃
- 【LeetCode動態規劃#08】完全揹包問題實戰與分析(零錢兌換II)LeetCode動態規劃
- Leetcode 題解演算法之動態規劃LeetCode演算法動態規劃
- 【LeetCode】55. 跳躍遊戲 (動態規劃)LeetCode遊戲動態規劃
- 動態規劃動態規劃
- 程式碼隨想錄演算法訓練營第二十三天| leetcode39. 組合總和、leetcode40.組合總和II、leetcode131.分割回文串演算法LeetCode
- [leetcode初級演算法]動態規劃總結LeetCode演算法動態規劃
- [LeetCode 中等 動態規劃 ]221. 最大正方形LeetCode動態規劃
- 【LeetCode動態規劃#06】分割等和子集(01揹包問題一維寫法實戰)LeetCode動態規劃
- python 動態規劃(揹包問題和最長公共子串)Python動態規劃
- 2024.9.6 leetcode 70 爬樓梯 (雜湊表/動態規劃)LeetCode動態規劃
- Leetcode 題解系列 -- 股票的最大利潤(動態規劃)LeetCode動態規劃
- 動態規劃法動態規劃