基础动态规划
class Solution {
public int minCut ( String s) {
int n = s. length ( ) ;
int [ ] dp = new int [ n] ;
for ( int i = 0 ; i < n; i++ ) {
if ( isPalindrome ( s, 0 , i) ) {
dp[ i] = 0 ;
} else {
dp[ i] = Integer. MAX_VALUE;
for ( int j = 0 ; j < i; j++ ) {
if ( isPalindrome ( s, j + 1 , i) )
dp[ i] = Math. min ( dp[ i] , dp[ j] + 1 ) ;
}
}
}
return dp[ n - 1 ] ;
}
public boolean isPalindrome ( String s, int start, int end) {
String t = s. substring ( start, end + 1 ) ;
char [ ] arr = t. toCharArray ( ) ;
int n = arr. length;
for ( int i = 0 ; i < n; i++ ) {
if ( arr[ i] != arr[ n - 1 - i] )
return false ;
}
return true ;
}
}
优化:动态规划 + 预处理
public int minCut ( String s) {
int n = s. length ( ) ;
if ( n < 2 ) {
return 0 ;
}
int [ ] dp = new int [ n] ;
for ( int i = 0 ; i < n; i++ ) {
dp[ i] = i;
}
boolean [ ] [ ] isPalindrome = new boolean [ n] [ n] ;
for ( int i = 0 ; i < n; i++ ) {
for ( int j = 0 ; j <= i; j++ ) {
if ( s. charAt ( i) == s. charAt ( j) && ( i - j <= 2 || isPalindrome[ j + 1 ] [ i - 1 ] ) ) {
isPalindrome[ j] [ i] = true ;
}
}
}
for ( int i = 1 ; i < n; i++ ) {
if ( isPalindrome[ 0 ] [ i] ) {
dp[ i] = 0 ;
continue ;
}
for ( int j = 0 ; j < i; j++ ) {
if ( isPalindrome[ j + 1 ] [ i] )
dp[ i] = Math. min ( dp[ i] , dp[ j] + 1 ) ;
}
}
return dp[ n - 1 ] ;
}