LeetCode-132. 分割回文串 II
难度:困难
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文。
返回符合要求的 最少分割次数 。
示例 :
输入:s = “aab”
输出:1
解释:只需一次分割就可将 s 分割成 [“aa”,“b”] 这样两个回文子串。
class Solution {
public:
int minCut(string s) {
if(s.size() == 0)return 0;
//记录字符串下标i-j是否是回文串
vector<vector<bool>> v(s.size(),vector<bool>(s.size()));
for(int k=0;k<s.size();k++){
//元素从下标k位置向左右拓展
//奇数
int i = k , j = k;
while(i>=0 && j<s.size()){
if(s[i] == s[j]){
v[i][j]=true;
i--;
j++;
}
else{
break;
}
}
//偶数
i=k;
j=k+1;
while(i>=0 && j<s.size()){
if(s[i] == s[j]){
v[i][j]=true;
i--;
j++;
}
else{
break;
}
}
}
vector<int> res(s.size()+1);//res[i]表示的是长度为i的字符串最少有多少个回文子串
res[0] = 0;
for(int i=1;i<=s.size();i++){
res[i] = INT_MAX;
for(int j=0;j<i;j++){
if(v[j][i-1]){ //如果下标为第j到i-1的字符串为回文子串,那么res[i]为res[j]+1
//res的下标和v的下标是错开了一个单位的,
//如v[0][1]表示字符串aa是否为回文子串,res[0]表示空串,res[1]表示a最少有多少回文子串
res[i] = min(res[i],res[j]+1);
}
}
}
return res[s.size()]-1;//res[i]表示的是最少有多少个回文子串,如果有五个回文子串,那么是需要划分四次,所以最终结果都要-1
}
};
执行结果:
通过
执行用时:
28 ms, 在所有 C++ 提交中击败了91.04%的用户
内存消耗:
8 MB, 在所有 C++ 提交中击败了58.13%的用户
通过测试用例:
36 / 36