palindrome partition II

来源:互联网 发布:手机怎么进去淘宝秒杀 编辑:程序博客网 时间:2024/05/28 23:19

中等 分割回文串 II

21%
通过

给定一个字符串s,将s分割成一些子串,使每个子串都是回文。

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

您在真实的面试中是否遇到过这个题? 
Yes
样例

比如,给出字符串s = "aab"

返回 1, 因为进行一次分割可以将字符串s分割成["aa","b"]这样两个回文子串


public class Solution {    private boolean isPalindrome(String s, int start, int end) {        for (int i = start, j = end; i < j; i++, j--) {            if (s.charAt(i) != s.charAt(j)) {                return false;            }        }        return true;    }    private boolean[][] getIsPalindrome(String s) {        boolean[][] isPalindrome = new boolean[s.length()][s.length()];        for (int i = 0; i < s.length(); i++) {            isPalindrome[i][i] = true;        }        for (int i = 0; i < s.length() - 1; i++) {            isPalindrome[i][i + 1] = (s.charAt(i) == s.charAt(i + 1));        }        for (int length = 2; length < s.length(); length++) {            for (int start = 0; start + length < s.length(); start++) {                isPalindrome[start][start + length]                    = isPalindrome[start + 1][start + length - 1] && s.charAt(start) == s.charAt(start + length);            }        }        return isPalindrome;    }    public int minCut(String s) {        // write your code here        if (s == null || s.length() == 0) {            return 0;        }        int[] cut = new int[s.length() + 1];        boolean[][] isPalindrome = getIsPalindrome(s);        cut[0] = 0;        for (int i = 1; i <= s.length(); i++) {            cut[i] = Integer.MAX_VALUE;            for (int j = 1; j <= i; j++) {                if (isPalindrome[i - j][i - 1] && cut[i - j] != Integer.MAX_VALUE) {                    cut[i] = Math.min(cut[i], cut[i - j] + 1);                }            }        }        return cut[s.length()] - 1;    }}/** * s="noonlevel" * s.length()=9 * int[] cut = new int[10]; * boolean[][] isPalindrome = getIsPalindrome(s); * * isPalindrome = new boolean[9][9]; *  * 0 1 2 3 4 5 6 7 8 * n o o n l e v e l *  *   0   1   2   3   4   5   6   7   8 * [ t][ f][ f][ t][ f][ f][ f][ f][ f] * [10][ t][ t][ f][ f][ f][ f][ f][ f] * [20][21][ t][ f][ f][ f][ f][ f][ f] * [30][31][32][ t][ f][ f][ f][ f][ f] * [40][41][42][43][ t][ f][ f][ f][ t] * [50][51][52][53][54][ t][ f][ t][ f] * [60][61][62][63][64][65][ t][ f][ f] * [70][71][72][73][74][75][76][ t][ f] * [80][81][82][83][84][85][86][87][ t] * isP[0][1] = s.charAt(0) == s.cahrAt(1) ==>f * isP[1][2] = s.charAt(1) == s.cahrAt(2) ==>t * isP[2][3] = s.charAt(2) == s.cahrAt(3) ==>f * isP[3][4] = s.charAt(3) == s.cahrAt(4) ==>f * isP[4][5] = s.charAt(4) == s.cahrAt(5) ==>f * isP[5][6] = s.charAt(5) == s.cahrAt(6) ==>f * isP[6][7] = s.charAt(6) == s.cahrAt(7) ==>f * isP[7][8] = s.charAt(7) == s.cahrAt(8) ==>f *  * l=2,  * isP[0][2] = isP[1][1]&&s.charAt(0) == s.cahrAt(2) ==> t&&f ==>f * isP[1][3] = isP[2][2]&&s.charAt(1) == s.cahrAt(3) ==> t&&f ==>f * isP[2][4] = isP[3][3]&&s.charAt(2) == s.cahrAt(4) ==> t&&f ==>f * ... * isP[5][7] = isP[6][6]&&s.charAt(5) == s.cahrAt(7) ==> t&&t ==>t * ... *  * l=3 * isP[0][3] = isP[1][2]&&s.charAt(0) == s.cahrAt(3) ==> t&&t ==>t * isP[1][4] = isP[2][3]&&s.charAt(1) == s.cahrAt(4) ==> f&&f ==>f * isP[2][5] = isP[3][4]&&s.charAt(2) == s.cahrAt(5) ==> f&&f ==>f * ... *  * l=4 * isP[0][4] = isP[1][3]&&s.charAt(0) == s.cahrAt(4) ==> f * isP[1][5] = isP[2][4]&&s.charAt(1) == s.cahrAt(5) ==> f * isP[2][6] = isP[3][5]&&s.charAt(2) == s.cahrAt(6) ==> f * isP[3][7] = isP[4][6]&&s.charAt(3) == s.cahrAt(7) ==> f * isP[4][8] = isP[5][7]&&s.charAt(4) == s.cahrAt(8) ==> t *  * l=5 * isP[0][5] = isP[1][4]&&s.charAt(0) == s.cahrAt(5) ==> f * isP[1][6] = isP[2][5]&&s.charAt(1) == s.cahrAt(6) ==> f * isP[2][7] = isP[3][6]&&s.charAt(2) == s.cahrAt(7) ==> f * isP[3][8] = isP[4][7]&&s.charAt(3) == s.cahrAt(8) ==> f *  * l=6 * isP[0][6] = isP[1][5]&&s.charAt(0) == s.cahrAt(6) ==> f * isP[1][7] = isP[2][6]&&s.charAt(1) == s.cahrAt(7) ==> f * isP[2][8] = isP[3][7]&&s.charAt(2) == s.cahrAt(8) ==> f *  * l=7 * isP[0][7] = isP[1][6]&&s.charAt(0) == s.cahrAt(7) ==> f * isP[1][8] = isP[2][7]&&s.charAt(1) == s.cahrAt(8) ==> f *  * l=8 * isP[0][8] = isP[1][7]&&s.charAt(0) == s.cahrAt(8) ==> f *  * cut[0] = 0;        for (int i = 1; i <= s.length(); i++) {            cut[i] = Integer.MAX_VALUE;            for (int j = 1; j <= i; j++) {                if (isPalindrome[i - j][i - 1] && cut[i - j] != Integer.MAX_VALUE) {                    cut[i] = Math.min(cut[i], cut[i - j] + 1);                }            }        }         *      0  1  2  3  4  5  6  7  8  9   * i=1 [0][~][0][0][0][0][0][0][0][0] * j=1 isP[0][0] && cut[0]!=~ => cut[1] = min(cut[1],cut[0]+1=1) =1 *     [0][1][0][0][0][0][0][0][0][0] *  * i=2 [0][1][~][0][0][0][0][0][0][0] * j=1 isP[1][1] && cut[1]!=~ => cut[2] = min(cut[2],cut[1]+1=2) =2 *     [0][1][2][0][0][0][0][0][0][0] * j=2 isP[0][1] && cut[1]!=~ => *     [0][1][2][0][0][0][0][0][0][0] *  * i=3 [0][1][2][~][0][0][0][0][0][0] * j=1 isP[2][2] && cut[2]!=~ => cut[3] = min(cut[3],cut[2]+1=3) =3 *     [0][1][2][3][0][0][0][0][0][0] * j=2 isP[1][2] && cut[1]!=~ => cut[3] = min(cut[3],cut[1]+1=2) =2 *     [0][1][2][2][0][0][0][0][0][0] * j=3 isP[0][2] && cut[0]!=~ =>  *     [0][1][2][2][0][0][0][0][0][0] *  * i=4 [0][1][2][2][~][0][0][0][0][0] * j=1 isP[3][3] && cut[3]!=~ => cut[4] = min(cut[4],cut[3]+1=3) =3 *     [0][1][2][2][3][0][0][0][0][0] * j=2 isP[2][3] && cut[2]!=~ =>  * j=3 isP[1][3] && cut[1]!=~ => * j=4 isP[0][3] && cut[0]!=~ => cut[4] = min(cut[4],cut[0]+1=1) =1 *     [0][1][2][2][1][0][0][0][0][0] *  * i=5 [0][1][2][2][1][~][0][0][0][0] * j=1 isP[4][4] && cut[4]!=~ => cut[5] = min(cut[5],cut[4]+1=2) =2 *     [0][1][2][2][1][2][0][0][0][0] * j=2 isP[3][4] && cut[3]!=~ => * j=3 isP[2][4] && cut[2]!=~ => * j=4 isP[1][4] && cut[1]!=~ => * j=5 isP[0][4] && cut[0]!=~ => *  * i=6 [0][1][2][2][1][2][~][0][0][0] * j=1 isP[5][5] && cut[5]!=~ => cut[6] = min(cut[6],cut[5]+1=3) =3 *     [0][1][2][2][1][2][3][0][0][0] * j=2 isP[4][5] && cut[4]!=~ => * j=3 isP[3][5] && cut[3]!=~ => * j=4 isP[2][5] && cut[2]!=~ => * j=5 isP[1][5] && cut[1]!=~ => * j=6 isP[0][5] && cut[0]!=~ => *  * i=7 [0][1][2][2][1][2][3][~][0][0] * j=1 isP[6][6] && cut[6]!=~ => cut[7] = min(cut[7],cut[6]+1=4) =4 *     [0][1][2][2][1][2][3][4][0][0] * j=2 isP[5][6] && cut[5]!=~ => * j=3 isP[4][6] && cut[4]!=~ => * j=4 isP[3][6] && cut[3]!=~ => * j=5 isP[2][6] && cut[2]!=~ => * j=6 isP[1][6] && cut[1]!=~ => * j=7 isP[0][6] && cut[0]!=~ => *  * i=8 [0][1][2][2][1][2][3][4][~][0] * j=1 isP[7][7] && cut[7]!=~ => cut[8] = min(cut[8],cut[7]+1=5) =5 *     [0][1][2][2][1][2][3][4][5][0] * j=2 isP[6][7] && cut[6]!=~ => * j=3 isP[5][7] && cut[5]!=~ => cut[8] = min(cut[8],cut[5]+1=3) =3 *     [0][1][2][2][1][2][3][4][3][0] * j=4 isP[4][7] && cut[4]!=~ => * j=5 isP[3][7] && cut[3]!=~ => * j=6 isP[2][7] && cut[2]!=~ => * j=7 isP[1][7] && cut[1]!=~ => * j=8 isP[0][7] && cut[0]!=~ => *  * i=9 [0][1][2][2][1][2][3][4][3][~] * j=1 isP[8][8] && cut[8]!=~ => cut[9] = min(cut[9],cut[8]+1=4) =4 *     [0][1][2][2][1][2][3][4][3][4] * j=2 isP[7][8] && cut[7]!=~ => * j=3 isP[6][8] && cut[6]!=~ =>  * j=4 isP[5][8] && cut[5]!=~ => * j=5 isP[4][8] && cut[4]!=~ => cut[9] = min(cut[9],cut[4]+1=2) =2 *     [0][1][2][2][1][2][3][4][3][2] * j=6 isP[3][8] && cut[3]!=~ => * j=7 isP[2][8] && cut[2]!=~ => * j=8 isP[1][8] && cut[1]!=~ => * j=8 isP[0][8] && cut[0]!=~ =>
 * return cut[9]-1=2-1=1
<pre name="code" class="java"> 
 *     0  1  2  3  4  5  6  7  8 *     n  o  o  n  l  e  v  e  l *  0  1  2  3  4  5  6  7  8  9 * [0][1][2][2][1][2][3][4][3][2]



0 0
原创粉丝点击