lintode(108)分割回文串 II
阿新 • • 發佈:2019-01-09
描述:
給定一個字串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]; } } } } };