【ATT】Palindrome Partitioning II
Q:
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.
A: 两个DP的结合: dp[i] = min(1+dp[j-1]) 如果s(i,j)是回文的。
同时检查回文也是一个DP
int minCut(string s) { // Start typing your C/C++ solution below // DO NOT write int main() function if(s.empty()) return 0; vector<vector<bool>> bPalin; int i,j; for(i=0;i<s.size();i++) bPalin.push_back(vector<bool>(s.size())); for(i=0;i<s.size();i++) bPalin[i][i] = true; for(i=s.size()-2;i>=0;i--) { bPalin[i][i+1] = (s[i]==s[i+1]?true:false); for(j=i+2;j<s.size();j++) { if(s[i]==s[j]&&bPalin[i+1][j-1]) bPalin[i][j] = true; else bPalin[i][j] = false; } } if(bPalin[0][s.size()-1]) return 0; vector<int> dp(s.size()); for(i=0;i<s.size();i++) { if(bPalin[0][i]) { dp[i] = 0; continue; } int curmin = INT_MAX; for(j=1;j<=i;j++) { if(bPalin[j][i]&&dp[j-1]+1<curmin) curmin = dp[j-1]+1; } dp[i] = curmin; } return dp[s.size()-1]; }