Given a string s, cut s into some substrings such that every substring is a palindrome.
Return the minimum cuts needed for a palindrome partitioning of s.
Example
Given s = "aab"
,
Return 1
since the palindrome partitioning ["aa", "b"] could be produced using 1 cut.
public class Solution {
/**
* @param s a string
* @return an integer
*/
//动态规划
//dp[i]表示以i结尾的字符串的最优回文划分
//若dp[i]=min(dp[i], dp[j-1]+1)), 0<=j<=i && s[j]~s[i]为回文
public int minCut(String s) {
boolean[][] palin_map = getPalinMap(s);
int n = s.length();
int[] dp = new int[n];
for(int i=0; i<n; i++){
dp[i] = i;
}
for(int i=0; i<n; i++){
for(int j=i; j>=0; j--){
if(palin_map[j][i]){
if(j==0){
dp[i] = 0;
}else{
dp[i] = Math.min(dp[i], dp[j-1]+1);
}
}
}
}
return dp[n-1];
}
boolean[][] getPalinMap(String s){
int n = s.length();
boolean[][] map = new boolean[n][n];
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
if(i>=j){
map[i][j] = true;
}else{
map[i][j] = false;
}
}
}
for(int len=2; len<=n; len++){
for(int i=0; i+len-1<n; i++){
int j=i+len-1;
if(s.charAt(i)==s.charAt(j)){
map[i][j]=map[i+1][j-1];
}else{
map[i][j]=false;
}
}
}
return map;
}
};