[抄题]:

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

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

[思维问题]:

不知道要用预处理字符串降低复杂度

[一句话思路]:

先把预处理获得s中回文串的结果放在数组中,之后直接调用

[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

[画图]:

[一刷]:

  1. 长区间依赖于短区间:先循环长度,再循环起点。递推关系:当前回文分割=下一字回文分割&当前字母。要有返回函数。
  2. 需要计算s.charAt(i + 1)时,上限是s.length() - 1
  3. 字符串取长度要加括号s.length()
  4. 从0开始,最后一位是i-1 递归调用的判断条件是isPalindrome[j][i - 1]

[二刷]:

  1. 要弄明白函数表达的目的。比如判断是不是回文串,就返回一个boolean数即可。
  2. 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()];
}
};

分割回文串 II · Palindrome Partitioning II的更多相关文章

  1. Leetcode之回溯法专题-131. 分割回文串(Palindrome Partitioning)

    Leetcode之回溯法专题-131. 分割回文串(Palindrome Partitioning) 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. ...

  2. LeetCode 131. 分割回文串(Palindrome Partitioning)

    题目描述 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. 示例: 输入: "aab" 输出: [ ["aa" ...

  3. LeetCode 131. 分割回文串(Palindrome Partitioning)

    131. 分割回文串 131. Palindrome Partitioning 题目描述 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. LeetC ...

  4. 分割回文串 · Palindrome Partitioning

    [抄题]: 给定一个字符串s,将s分割成一些子串,使每个子串都是回文串. 返回s所有可能的回文串分割方案. 给出 s = "aab",返回 [ ["aa", & ...

  5. Java实现 LeetCode 132 分割回文串 II(二)

    132. 分割回文串 II 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回符合要求的最少分割次数. 示例: 输入: "aab" 输出: 1 解释: 进行一 ...

  6. lintcode:Palindrome Partitioning 分割回文串

    题目: 分割回文串 给定一个字符串s,将s分割成一些子串,使每个子串都是回文串. 返回s所有可能的回文串分割方案. 样例 给出 s = "aab",返回 [ ["aa&q ...

  7. Leetcode 132.分割回文串II

    分割回文串 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回符合要求的最少分割次数. 示例: 输入: "aab" 输出: 1 解释: 进行一次分割就可将 s ...

  8. [LeetCode] 132. 分割回文串 II

    题目链接 : https://leetcode-cn.com/problems/palindrome-partitioning-ii/ 题目描述: 给定一个字符串 s,将 s 分割成一些子串,使每个子 ...

  9. Leetcode 131.分割回文串

    分割回文串 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. 示例: 输入: "aab" 输出: [ ["aa" ...

  10. 【LEETCODE】72、分割回文串 III 第1278题

    package y2019.Algorithm.dynamicprogramming.hard; /** * @Auther: xiaof * @Date: 2019/12/11 08:59 * @D ...

随机推荐

  1. Linux 期中架构 rsync

    上篇 Rsync rysnc查看版本   --version 全量  与增量在效率上有区别 cp mv scp  --全量复制 rsync       --增量复制 rsync利用的是quick ch ...

  2. python3 钉钉群机器人 webhook

    import requests import json url='https://oapi.dingtalk.com/robot/send?access_token=替换成你自己的toten' pro ...

  3. KCP 传输协议

    作者:韦易笑链接:https://www.zhihu.com/question/36258781/answer/98944369来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...

  4. Python 编程规范梳理

    缘由 由于项目团队中新加入了几名攻城狮, 大家之前的背景各不相同,写出的代码也是“风格迥异”.正所谓:“无规则不成方圆”,因此需要对编程进行必要的规范. 整体的思路是:依照PEP8 Python 编码 ...

  5. Sublime Text 3 个人使用总结

    待更新 Sublime Text 3\Packages\FileHeader\template\header

  6. 简单学习Git

    Git是什么? Git是目前世界上最先进的分布式版本控制系统(没有之一). Git有什么特点?简单来说就是:高端大气上档次! Git的发展历史 很多人都知道,Linus在1991年创建了开源的Linu ...

  7. uva-331-枚举-交换的方案数

    题意:冒泡排序,最小交换数的前提下有多少用方案把数组变成从小到大的顺序, 注意: 3 2 1 3的下表是1  2的是2 1的是3  交换 3 2,那么第一个交换数是1 最小交换数=逆序数的和 那么,只 ...

  8. 代码:css小图标

    向下小箭头 .icon-tip{ border-color: transparent transparent #bb0808 transparent; border-style:solid; bord ...

  9. DNS配置注意事项 正在连接网络

    故障现象 公司规模不是很大,大概有50多台计算机,购买了两台IBM服务器.由于内部使用的某个应用软件需要Windows域的支持,所以在这两台IBM服务器上启用了windows 2000 Server的 ...

  10. JUC学习记录

    先附上学习的博客地址:http://blog.csdn.net/cx8122389/article/details/70049425, 具体见该博客 Java JUC 简介 在Java 5.0 提供了 ...