Link:https://leetcode-cn.com/classic/problems/palindrome-partitioning-ii/description/
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回符合要求的最少分割次数。
示例:
输入: "aab" 输出: 1 解释: 进行一次分割就可将 s 分割成 ["aa","b"] 这样两个回文子串。
AC code:
class Solution {
public:
int minCut(string s) {
const int len=s.size();
int dp[len+5],ispal[len+5][len+5];
memset(ispal,0,sizeof(ispal));
memset(dp,0,sizeof(dp));
int i,j,k;
for(i=0;i<len;i++)
{
for(j=i;j>=0;j--)
{
if(s[i]==s[j]&&(i-j<=1||ispal[j+1][i-1]))
{
ispal[j][i]=1;
}
}
}
for(i=0;i<len;i++)
{
dp[i]=i;
for(j=i;j>=0;j--)
{
if(ispal[j][i]&&j!=0)
dp[i]=min(dp[i],dp[j-1]+1);
else if(ispal[j][i]&&j==0)
dp[i]=0;
}
}
return dp[len-1];
}
};
/* TLE code:
class Solution {
public:
int minCut(string s) {
int out=0;
int cnt=s.size();
partitionDFS(s, 0, out,cnt);
return cnt-1;
}
void partitionDFS(string s, int start, int &out, int &cnt) {
if (start == s.size()) {
if(cnt>out)
cnt=out;
return;
}
for (int i = start; i < s.size(); ++i) {
if (isPalindrome(s, start, i)) {
out++;
partitionDFS(s, i + 1, out, cnt);
out--;
}
}
}
bool isPalindrome(string s, int start, int end) {
while (start < end) {
if (s[start] != s[end]) return false;
++start;
--end;
}
return true;
}
};*/