当前位置 博文首页 > 数据结构和算法:LeetCode 1745. 回文串分割 IV

    数据结构和算法:LeetCode 1745. 回文串分割 IV

    作者:[db:作者] 时间:2021-09-09 13:31

    截止到目前我已经写了 600多道算法题,其中部分已经整理成了pdf文档,目前总共有1000多页(并且还会不断的增加),大家可以免费下载
    下载链接:https://pan.baidu.com/s/1hjwK0ZeRxYGB8lIkbKuQgQ
    提取码:6666

    在这里插入图片描述
    在这里插入图片描述

    ublic boolean checkPartitioning(String s) {
       for (int i = 0; i < s.length(); i++) {
           for (int j = i + 1; j < s.length() - 1; j++) {
               //截取字符串[0,i]
               String str1 = s.substring(0, i + 1);
               //截取字符串[i+1,j]
               String str2 = s.substring(i + 1, j + 1);
               //截取字符串[j+1,s.length()-1]
               String str3 = s.substring(j + 1, s.length());
               //把字符串s截取3段,判断每段是否都是回文的
               if (isPalindrome(str1) && isPalindrome(str2) && isPalindrome(str3))
                   return true;
           }
       }
       return false;
    

    如果字符串s比较短的话,上面代码是没有问题的,但如果字符串s比较长,很容易超时。

    我们可以先计算字符串s的所有子串中哪些是回文的,哪些不是,然后再判断。关于计算方式在《540,动态规划和中心扩散法解回文子串》中有详细介绍,除此之外还可有看下

    553,动态规划解分割回文串 II

    551,回溯算法解分割回文串

    517,最长回文子串的3种解决方式

    这里就不在重复介绍。我们来直接看下代码

    public boolean checkPartitioning(String s) {
        int length = s.length();
        //dp[i][j]:表示字符串s从下标i到j是否是回文串
        boolean[][] dp = new boolean[length][length];
        for (int i = length - 1; i >= 0; i--) {
            for (int j = i; j < length; j++) {
                //如果i和j指向的字符不一样,那么dp[i][j]就
                //不能构成回文字符串
                if (s.charAt(i) != s.charAt(j))
                    continue;
                dp[i][j] = j - i <= 2 || dp[i + 1][j - 1];
            }
        }
    
        //然后再截取3段,判断这3段是否都是回文的
        for (int i = 0; i < length; i++) {
            for (int j = i + 1; j < length - 1; j++) {
                if (dp[0][i] && dp[i + 1][j] && dp[j + 1][length - 1])
                    return true;
            }
        }
        return false;
    }
    
    cs