zoukankan      html  css  js  c++  java
  • 分割回文串 II · Palindrome Partitioning II

    [抄题]:

    给定一个字符串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()];
        }
    };
    View Code
  • 相关阅读:
    localStorage cache
    webpack的学习过程
    npm install --save/--save-dev的区别
    .gitignore常见问题
    jQuery的优点与缺点
    JSONP是什么
    Node.js-Usage & Example
    【转】Swig Getting Started
    【转】使用Spring MVC统一异常处理实战
    C++-Qt【5】-QT的QString,char*,QByteArray转化以及中文乱码的问题
  • 原文地址:https://www.cnblogs.com/immiao0319/p/8439829.html
Copyright © 2011-2022 走看看