2017.10.24
理论上应该是很简单的 d[i][j] = min(d[i][k]+d[k+1][j]+1,d[i][j],但是如果单纯使用递归的话,显然会超时的。
后来采用数组记录d[i][j]的值,基本通过97%,但仍旧会超时。
在后来改变判断回文的办法,同样采用数组进行保存,这样就过了。
public class Solution {
/**
* @param s a string
* @return an integer
*/
public int minCut(String s) {
// write your code here
boolean[][] isHui = new boolean[s.length()][s.length()];
isHui = isHuiWen(isHui,s);
if(s.length() <= 1){
return 0;
}
//建立数组,记录 arr[i][j]表示的是从第i个字符到第j个字符的最小分割数
int [][]arr = new int[s.length()][s.length()];
for(int i = 0; i < s.length()-1; i++){
if(isHui[i][i+1] == true){
arr[i][i+1] = 0;
}
else{
arr[i][i+1] = 1;
}
}
for(int i = 2; i < s.length(); i++){
for(int j = 0; j < s.length()- i; j++){
arr[j][j+i] = i;
if(isHui[j][j+i] == true){
arr[j][j+i] = 0;
}
else{
for(int k = 0; k < i; k ++){
if(arr[j][j+i] == 1){
break;
}
arr[j][j+i] = Math.min(arr[j][j+k] + arr[j+k+1][j+i] + 1,arr[j][j+i]);
}
}
}
}
return arr[0][s.length()-1];
}
public boolean[][] isHuiWen(boolean[][] isHui,String s){
for(int i = 0; i < s.length(); i++){
isHui[i][i] = true;
if(i < s.length()-1 && s.charAt(i) == s.charAt(i+1)){
isHui[i][i+1] = true;
}
}
for(int i = 2; i < s.length(); i++){
for(int j = 0; j < s.length()- i; j++){
if(s.charAt(j) != s.charAt(j+i)){
isHui[j][i+j] = false;
continue;
}
isHui[j][i+j] = isHui[j+1][i+j-1];
}
}
return isHui;
}
};