方法1: dfs + memo。比较简单,不过多赘述。
class Solution {
Map<String, Integer> map = new HashMap<>();
public int minCut(String s) {
if(isPalindrome(s, s.length() - 1) || s.length() == 0 || s.length() == 1) return 0;
if(map.containsKey(s)) return map.get(s);
int count = Integer.MAX_VALUE;
for(int i = 0; i < s.length(); i++){
if(isPalindrome(s, i)){
count = Math.min(count, 1 + minCut(s.substring(i + 1)));
}
}
map.put(s, count);
return count;
}
public boolean isPalindrome(String s, int i){
int left = 0;
int right = i;
while(left <= right){
if(s.charAt(left) != s.charAt(right)) return false;
left++;
right--;
}
return true;
}
}
方法2: dp。直接看这个链接。
class Solution {
public int minCut(String s) {
int n = s.length();
boolean isPal[][] = new boolean[n+1][n+1];
int min[] = new int[n];
for(int i=0; i<n; ++i) {
min[i] = i;
for(int j=0; j<=i; ++j) {
if(s.charAt(i) == s.charAt(j) && (j+1 > i-1 || isPal[j+1][i-1])) {
isPal[j][i] = true;
min[i] = j == 0 ? 0 : Math.min(min[i], min[j-1] + 1);
}
}
}
return min[n-1];
}
}
总结:
- 无