个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【手撕算法系列专栏】【LeetCode】
🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助
🍓希望我们一起努力、成长,共同进步。
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文。
返回符合要求的 最少分割次数 。
示例1:
输入:s = “aab”
输出:1
解释:只需一次分割就可将 s 分割成 [“aa”,“b”] 这样两个回文子串。
示例2:
输入:s = “a”
输出:0
示例3:
输入:s = “ab”
输出:1
注意:
1 <= s.length <= 2000
s 仅由小写英文字母组成
状态表示:
dp[i]
:表示区间[0,i]之间最长的子串的最少分割次数。状态转移方程如下:
class Solution {
public:
int minCut(string s) {
int n = s.size();
vector<vector<bool>> isPal(n,vector<bool>(n));
for(int i = n - 1;i >= 0;i--)
for(int j = i;j < n;j++)
if(s[i] == s[j])
isPal[i][j] = i + 1 < j ? isPal[i + 1][j - 1] : true;
vector<int> dp(n,INT_MAX);
for(int i = 0;i < n;i++)
{
if(isPal[0][i]) dp[i] = 0;
else
{
for(int j = 1;j <= i;j++)
{
if(isPal[j][i]) dp[i] = min(dp[i],dp[j - 1] + 1);
}
}
}
return dp[n - 1];
}
};
最后就顺利通过啦!!!