【题目描述】Given a string s, partition s such that every substring of the partition is a palindrome.
Return the minimum cuts needed for a palindrome partitioning of s.
For example, given s =“aab”,
Return1since the palindrome partitioning[“aa”,“b”]could be produced using 1 cut.
【解题思路】动态规划思想。先构造个dp[][],和上文的含义一样,不过构造方式我借用了别人的写法,很巧妙,也类似于动态规划,不用像之前的写法每次判断一下子串是不是回文,再赋值为true或flase。再构造个count ,其实这个count的逐步构造才是这个题最根本的动态规划思想,具体的解释写在注释里了。
【考查内容】字符串,动态规划
class Solution {
public:
int minCut(string s) {
int n=s.length();
if (0==n)
return 0;
vector<vector<bool>> dp(n,vector<bool>(n,false));
vector<int> count(n+1);
count[0]=0;
count[1]=1;
for(int j=0;j<n;++j)
for(int i=0;i<=j;++i){
dp[i][j]=(s[i]==s[j])&&( j-i<=2 || dp[i+1][j-1] );
//从i到j是不是回文,必须外循环是j
}
//例如,5个字符的最小分割数量取决于:<前4个字符的最小分割数量+1>或者
//<后两个是不是回文:(不是的话不用管它)是的话,前3个字符的最小分割数量+1> 或者
//<后三个是不是回文:(不是的话不用管它)是的话,前2个字符的最小分割数量+1> 或者
//<后四个是不是回文:(不是的话不用管它)是的话,前1个字符的最小分割数量+1> 或者
//<后五个是不是回文:(不是的话不用管它)是的话,前0个字符的最小分割数量+1>
//(这里前0个字符的最小分割是0,前1个字符的最小分割是1)初始化的 可以理解吧
//注意上边的ij是s的下标是s[i] s[j]表示位置。
//注意下面的ij是第i个第j个字符,第0个其实是不存在的,对应count[0]=0,代表前0个字符的最小分割数量是0
for(int i=2;i<n+1;++i){
count[i]=count[i-1]+1;//<前i-1个字符的最小分割数量+1>
for(int j=i-1;j>=1;--j){
if(dp[j-1][i-1]){
count[i]=min(count[j-1]+1,count[i]);
}else{
//这里对应上边说的(不是的话不用管它)
}
}
}
return count[n]-1;//分割数量-1是切了几刀
}
};