1. 程式人生 > >lintode(108)分割回文串 II

lintode(108)分割回文串 II

描述:

給定一個字串s,將s分割成一些子串,使每個子串都是迴文。

返回s符合要求的的最少分割次數。


樣例:

比如,給出字串s = "aab"

返回 1, 因為進行一次分割可以將字串s分割成["aa","b"]這樣兩個迴文子串


思路:

eg:aabbaac

首先確定從s[i]到s[j]是否為回字符串

a a b b a a c
a T T F F F T F
a T F F T F F
b T T F F F
b T F F F
a T T F
a T F
c T

然後統計最小分割次數:

0 1 2 3 4 5 6
result 1 3 2 2 1 1 0
public class Solution {
    /**
     * @param s a string
     * @return an integer
     */
    public int minCut(String s) {
        // write your code here
        if(s == null || s.length() == 0){
            return 0;
        }
        int len = s.length();
        int[] result = new int[len];
        boolean[][] whether = new boolean[len][len];
        search(whether , s);
        for(int i = len - 1;i>=0;i--){
            if(whether[i][len - 1]){
                result[i] = 0;
                continue;
            }
            result[i] = len - 1;
            for(int j = i+1;j<len;j++){
                if(whether[i][j - 1]){
                    result[i] = Math.min(result[i] , result[j] + 1);
                }
            }
        }
        return result[0];
    }
    
    public void search(boolean[][] whether , String s){
        for(int l = 1 ; l<= s.length();l++){
            for(int i = 0;i <= s.length() - l;i++){
                int j = i + l -1;
                if(l == 1){
                    whether[i][j] = true;
                }else if(l == 2){
                    whether[i][j] = (s.charAt(i) == s.charAt(j));
                }else{
                    whether[i][j] = (s.charAt(i) == s.charAt(j)) && whether[i+1][j-1];
                }
            }
        }
    }
};