这道题主要是知道如何定义自定义方程以及如何判断一个字符串是否为回文串。
-
定义状态方程 dp[i]一维数组,表示0到i+1的字符分割回文子串的最小次数。
-
判断字符串是否为一个回文串,因为字符串长度较大,如果使用双指针进行判断,就会出现超时。就只可以使用dp数组进行判断。动态转移方程 dp[i][j] = dp[i+1][j-1] && s.charAt(i) == s.charAt(j)
代码如下:
public int minCut(String s) {
if (s.length() == 1) return 0;
boolean[][] dp = new boolean[s.length()+1][s.length()+1];
int[] f= new int[s.length()];
Arrays.fill(f,Integer.MAX_VALUE);
for (int i = s.length(); i >= 0; i--) {
for (int j = s.length(); j >= 0; j--) {
if (i > j) continue;
else if (i == j-1 || j == i) dp[i][j] = true;
else dp[i][j] = dp[i+1][j-1] && s.charAt(i) == s.charAt(j-1);
}
}
for (int i = 0; i < s.length(); i++) {
if (dp[0][i+1]) f[i] = 0;
else{
for (int j = 0; j <= i; j++) {
if (dp[j][i+1]) f[i] = Math.min(f[i], f[j-1]+1);
}
}
}
return f[s.length()-1];
}
说实话,这道题还是很难得,事后诸葛亮的话,还是容易理解的,就是不容易想到的。。。。。。。