【LeetCode刷題(困難程度)】132. 分割回文串 II
給定一個字串 s,將 s 分割成一些子串,使每個子串都是迴文串。
返回符合要求的最少分割次數。
示例:
輸入: “aab”
輸出: 1
解釋: 進行一次分割就可將 s 分割成 [“aa”,“b”] 這樣兩個迴文子串。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/palindrome-partitioning-ii
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
思路:使用動態規劃。
從最優策略的前提下關注最後一段迴文串。設為:S[j...N-1]
,那麼要知道整個字串能劃分成最少則還需要知道S
前j
個字元[0..j-1]
最少可以劃分成幾個迴文串。(劃分出了子問題)
初始條件:f[0] = 0
前0
個字元可以劃分成0
個迴文串個數。
用f[i]
表示前i
個字元S[0..i-1]
最少可以劃分成的迴文串個數。
則轉移方程:
判斷迴文串:採用從中心向兩邊擴張的方法。(優化的話可以用馬拉車)
class Solution {
public:
int minCut(string s) {
int n = s.size();
if(n == 0)
return 0;
vector<vector<bool>> isPalin(n,vector<bool>(n,false));
isPalin = calcPalin(s);
vector<int>f(n+1,0);
f[0] = 0;
for(int i = 1;i <= n;++i)
{
f[i] = INT_MAX;
for(int j = 0; j < i;++j)
{
if(isPalin[j][i - 1])//只要j到i-1是迴文串 就更新
{
f[i] = min(f[i],f[j] + 1);
}
}
}
return f[n] - 1;//題目中求的是分割字串次數 我們求出了能分出多少個字串
//那麼次數就是字串個數減1
}
private:
vector<vector<bool>> calcPalin(const string& s)
{
int n = s.size();
vector<vector<bool>>f(n,vector<bool>(n,false));
int i;
int j;
//奇數情況
for(int c = 0; c < n; ++c)
{
i = j = c;
//生成迴文串法檢測迴文串
while(i >= 0&&j < n && s[i] == s[j])
{
f[i][j] = true;
--i;
++j;
}
}
//偶數情況
for(int c = 0;c < n - 1;++c)
{
i = c;
j = c + 1;
while(i >= 0 && j < n && s[i] == s[j])
{
f[i][j] = true;
--i;
++j;
}
}
return f;
}
};
相關文章
- LeetCode 分割回文串II(動態規劃)LeetCode動態規劃
- leetcode------分割回文串LeetCode
- LeetCode-131-分割回文串LeetCode
- 分割回文串
- 回溯演算法 LeetCode 131 分割回文子串演算法LeetCode
- Leetcode171-190刷題筆記(非困難題)LeetCode筆記
- LeetCode 39. 組合總和 40.組合總和II 131.分割回文串LeetCode
- Leetcode 通過率最高的困難題 N皇后 II 【回溯解法-剪枝】LeetCode
- Day 26| 39. 組合總和 、 40.組合總和II 、 131.分割回文串
- 【LeetCode刷題(中等程度)】946. 驗證棧序列LeetCode
- leetcod 131.分割回文串(回溯、迴文字串)字串
- 程式碼隨想錄演算法訓練營第二十三天| leetcode39. 組合總和、leetcode40.組合總和II、leetcode131.分割回文串演算法LeetCode
- LeetCode刷題日記 416. 分割等和子集LeetCode
- 【LeetCode刷題(中等程度)】662. 二叉樹最大寬度LeetCode二叉樹
- LeetCode中動態規劃題解合集(根據難易程度))LeetCode動態規劃
- Python找回文子串的方法Python
- leetcode410分割陣列的最大值(二分+貪心,困難)LeetCode陣列
- #leetcode刷題之路3-無重複字元的最長子串LeetCode字元
- [LeetCode 刷題] 3. 無重複字元的最長子串 (Medium)LeetCode字元
- 一些困難題
- LeetCode 刷題—樹LeetCode
- LeetCode刷題 堆LeetCode
- LeetCode刷題整理LeetCode
- leetcode刷題(一)LeetCode
- LeetCode 不只是題解(10.正規表示式匹配[困難])LeetCode
- 3045. 統計前字尾下標對 II(困難)
- 想轉行遇到刷題困擾
- ctfshow_web_1(困難題)Web
- Leetcode:1616. 分割兩個字串得到迴文串LeetCode字串
- LeetCode刷題記錄LeetCode
- leetcode刷題筆記LeetCode筆記
- 如何使用leetcode刷題LeetCode
- Leetcode刷題分類LeetCode
- LeetCode 刷題筆記LeetCode筆記
- Leetcode刷題準備LeetCode
- LeetCode刷題—陣列LeetCode陣列
- 【一天一大 lee】N皇后 II (難度:困難) - Day20201017
- 【LeetCode刷題(簡單程度)】劍指 Offer 57. 和為s的兩個數字LeetCode