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.
Idea: Dynamic programming + nested loop
Similar with problem of combination of Word Break and Longest Palindromic Substring,
1. Generate a dictionary first to determine whether is valid palindrome or not
2. such as Word Break is to determine whether the string can be cut or not
but this time is to return minimum cut instead of true or false
DP formula: res[i+1]<- min(res[i+1],res[j]+1)
public static int minCut(String s) {
if(s==null || s.length()==0) return -1;
int len=s.length();
boolean[][] dict=palinDict(s);
int[] res=new int[len+1];
res[0]=0;
for(int i=0;i<len;i++){
res[i+1]=i+1;
for(int index=0;index<=i;index++){
if(dict[index][i]){
res[i+1]=Math.min(res[i+1],res[index]+1);
}
}
}
return res[len]-1;
}
//Dynamic programming approach for generate palindrome dictionary
private static boolean[][] palinDict(String s){
int len=s.length();
boolean[][] dict=new boolean[len][len];
for(int i=len-1;i>=0;i--){
for(int j=i;j<len;j++){
if(s.charAt(i)==s.charAt(j) && (j-i<2 || dict[i+1][j-1])){
dict[i][j]=true;
}
}
}
return dict;
}