可以用DP解题,但复杂度为O(n^3),会超时。
这题可以转换为单源最短路径:两点之间的距离定义为最少分割几次。 初始化情况是:只有两点之间的部分为回文串才有直接路径,且长度为0.
注意调整初始化的顺序,以使得初始化时间复杂度在O(n^2)。
public class Solution {
public boolean[][] isSymentric;
public void isPalindrome(String s) {
int len = s.length();
isSymentric = new boolean[len + 10][len + 10];
for (int j = 0; j < len; j++)
for (int i = j; i >= 0; i--) {
if(j == i) isSymentric[i][j] = true;
else if (s.charAt(i) != s.charAt(j))
isSymentric[i][j] = false;
else if (j - i <= 1)
isSymentric[i][j] = true;
else isSymentric[i][j] = isSymentric[i+1][j-1];
}
}
public int minCut(String s) {
// Start typing your Java solution below
// DO NOT write main() function
if (null == s)
return 0;
int len = s.length();
if (len <= 0)
return 0;
isPalindrome(s);
boolean []isVisted = new boolean[len+10];
int []value = new int[len+10];
for(int i=0;i<len;i++) {
if(isSymentric[0][i]) value[i] = 0;
else value[i] = len - 1;
isVisted[i] = false;
}
for(int i=0;i<len;i++) {
int index = -1;
for(int j=0;j<len;j++)
if(!isVisted[j])
if(index==-1 || value[j]<value[index]){
index = j;
}
isVisted[index] = true;
for(int j=index+1;j<len;j++) {
if(!isVisted[j] && isSymentric[index+1][j]) {
if(value[index] + 1 < value[j]) value[j] = value[index] + 1;
}
}
}
return value[len-1];
}
}