题目: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"
,
Return 1
since the palindrome partitioning ["aa","b"]
could
be produced using 1 cut.
思路:
本题使用动态规划,一开始使用dp[i][j]二维数组代表从i到j能否形成回文串,这里面有一些小技巧比如:如果dp[i][j]是真的话,那么dp[i+1][j-1]也是真之类的。
当然,首先,count[i]=min{ count[i],count[j+1]+1 }&&dp[i][j]==1 这个核心的条件。
在最后的代码里面,最终判断的时候就一个判断句。
代码:
class Solution { public: //https://leetcode.com/problems/palindrome-partitioning-ii/ int minCut(string s) { //核心公式 // count[i]=从i到尾的最小剪切数 // count[i]=min{ count[j+1]+1 } + dp[i][j]==1 j=i....s.length() int len = s.size(); int count[len+1]; bool dp[len][len]; for(int i = 0; i <= len; i++){ count[i] = len-i; } for(int i = 0; i < len; i++){ for(int j = 0; j < len; j++){ dp[i][j] = false; } } for(int i=len-1;i>=0;i--){ for(int j=i;j<=len-1;j++){ if((j-i<2||dp[i+1][j-1]==1)&& s[i]==s[j]){ dp[i][j]=true; count[i]=min( count[i],count[j+1]+1 ); } } } return count[0]-1; } };