[抄题]:
给定一个字符串s,将s分割成一些子串,使每个子串都是回文。
返回s符合要求的的最少分割次数。
[思维问题]:
不知道要用预处理字符串降低复杂度
[一句话思路]:
先把预处理获得s中回文串的结果放在数组中,之后直接调用
[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):
[画图]:
[一刷]:
- 长区间依赖于短区间:先循环长度,再循环起点。递推关系:当前回文分割=下一字回文分割&当前字母。要有返回函数。
- 需要计算s.charAt(i + 1)时,上限是s.length() - 1
- 字符串取长度要加括号s.length()
- 从0开始,最后一位是i-1 递归调用的判断条件是isPalindrome[j][i - 1]
[二刷]:
- 要弄明白函数表达的目的。比如判断是不是回文串,就返回一个boolean数即可。
- isPalindrome[j][i - 1]表示从第j 位到最后一位,而不是反之
[三刷]:
[四刷]:
[五刷]:
[五分钟肉眼debug的结果]:
f[i] = i - 1写成n - 1 了,临时变量不要写成上限
[总结]:
第0位拿来初始化。因此数组多加一位,最后一位也要处理,边界变成<=
[复杂度]:Time complexity: O(n^2) Space complexity: O(n^2) 二维数组
降低查询回文判断的方法:预处理,存在数组中,选i j,为n^2。查询数组为1
[英文数据结构或算法,为什么不用别的数据结构或算法]:
DP最少方法
[其他解法]:
[Follow Up]:
[LC给出的题目变变变]:
95. Unique Binary Search Trees II DP,虽然不是切单词
[代码风格] :

public class Solution { /** * @param s a string * @return an integer */ //isPalindrome 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; } //getIspalindrome 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++) { if (s.charAt(i) == s.charAt(i + 1)) { isPalindrome[i][i + 1] = true; } else isPalindrome[i][i + 1] = false; } 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) { //corner case if (s == null || s.length() == 0) { return 0; } //state boolean[][] isPalindrome = getIspalindrome(s); int[] f = new int[s.length() + 1]; //initialization for (int i = 0; i <= s.length(); i++) { f[i] = i - 1; } //function for (int i = 1; i <= s.length(); i++) { for (int j = 0; j < i; j++) { if (isPalindrome[j][i - 1]) { f[i] = Math.min(f[i], f[j] + 1); } } } //answer return f[s.length()]; } };