Leetcode -- Palindrome Partitioning II, leetcode
Problem Description:
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"
,
Return1
Since the palindrome partitioning["aa","b"]
Cocould be produced using 1 cut.
Analysis: Set cut [I] = the minimum number of cut between [0, I] and n as the string length,
Cut [I] = min (cut [I], 1 + cut [j]) 0 <= j <I
After a transfer function exists, a problem arises, that is, how can we determine whether [j, I] is a reply? How can I compare them from I to j every time? It's a waste. This is also a DP problem.
Define functions
Flag [I] [j] = true if [I, j] is the background
So
Flag [I] [j] = str [I] = str [j] & P [I + 1] [J-1];
class Solution {public: int minCut(string s) { //if(s.size()==0) // return 0; int n=s.size(); vector<vector<int> > flag(n,vector<int>(n,0)); vector<int> cut(n+1); for(int i=0;i<=n;i++) cut[i]=i-1; for(int i=0;i<n;i++) { for(int j=0;j<=i;j++) { if(s[i]==s[j]&&(i-j<2||flag[j+1][i-1]==1)) { flag[j][i]=1; cut[i+1]=min(cut[i+1],cut[j]+1); } } } return cut[n]; }};