(动态规划) 132. 分割回文串 II ——【Leetcode每日一题】

这篇具有很好参考价值的文章主要介绍了(动态规划) 132. 分割回文串 II ——【Leetcode每日一题】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

❓ 132. 分割回文串 II

难度:困难

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

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

示例 1:

输入:s = “aab”
输出:1
解释:只需一次分割就可将 s 分割成 [“aa”,“b”] 这样两个回文子串。

示例 2:

输入:s = “a”
输出:0

示例 3:

输入:s = “ab”
输出:1

提示

  • 1 < = s . l e n g t h < = 2000 1 <= s.length <= 2000 1<=s.length<=2000
  • s 仅由小写英文字母组成

💡思路:动态规划

  1. 定义一个二维数组 isPalindromic[i][j],记录 [i, j] 是不是回文子串
    • 该二维数组从右下角开始遍历,如果 s[i] == s[j] 则判断 j - i <= 1 或者 判断内部 isPalindromic[i + 1][j - 1] 是否是回文字符串
      (动态规划) 132. 分割回文串 II ——【Leetcode每日一题】,LeetCode,动态规划,leetcode,算法
  2. 定义一维 dp 数组, dp[i] 表示使范围是 [0, i] 的子串分割成回文串,最少分割次数是 dp[i]:
    • 如果要对长度为 [0, i] 的子串进行分割,分割点为 j :
      • 如果分割后,区间 [j + 1, i] 是回文子串,那么 dp[i] 就等于 dp[j] + 1;
      • 我们要找做小分割数量所以递推公式为: d p [ i ] = m i n ( d p [ i ] , d p [ j ] + 1 ) dp[i] = min(dp[i], dp[j] + 1) dp[i]=min(dp[i],dp[j]+1)
  3. 最后 dp[n - 1] 即为 所求 最少分割次数。

🍁代码:(C++、Java)

C++

class Solution {
public:
    int minCut(string s) {
        int n = s.size();
        vector<vector<bool>> isPalindromic(n, vector<bool>(n, false));//二维数组,isPalindromic[i][j]表示[i, j]是不是回文子串
        for(int i = n - 1; i >= 0; i--){
            for(int j = i; j < n; j++){
                if(s[i] == s[j] && (j - i <= 1 || isPalindromic[i + 1][j - 1])){
                    isPalindromic[i][j] = true;
                }
            }
        }

        //初始化dp数组,dp[i]表示范围是[0, i]的回文子串,最少分割次数是dp[i]
        vector<int> dp(n);
        for(int i = 0; i < n; i++) dp[i] = i;
        for(int i = 1; i < n; i++){
            if(isPalindromic[0][i])
            {
                dp[i] = 0;
                continue;
            }
            for(int j = 0; j < i; j++){
                if(isPalindromic[j + 1][i]){
                    dp[i] = min(dp[i], dp[j] + 1);
                }
            }
        }
        return dp[n - 1];
    }
};

Java

class Solution {
    public int minCut(String s) {
        int n = s.length();
        boolean[][] isPalindromic = new boolean[n][n];//二维数组,isPalindromic[i][j]表示[i, j]是不是回文子串
        for(int i = n - 1; i >= 0; i--){
            for(int j = i; j < n; j++){
                if(s.charAt(i) == s.charAt(j) && (j - i <= 1 || isPalindromic[i + 1][j - 1])){
                    isPalindromic[i][j] = true;
                }
            }
        }

        //初始化dp数组,dp[i]表示范围是[0, i]的回文子串,最少分割次数是dp[i]
        int[] dp = new int[n];
        for(int i = 0; i < n; i++) dp[i] = i;
        for(int i = 1; i < n; i++){
            if(isPalindromic[0][i])
            {
                dp[i] = 0;
                continue;
            }
            for(int j = 0; j < i; j++){
                if(isPalindromic[j + 1][i]){
                    dp[i] = Math.min(dp[i], dp[j] + 1);
                }
            }
        }
        return dp[n - 1];
    }
}
🚀 运行结果:

(动态规划) 132. 分割回文串 II ——【Leetcode每日一题】,LeetCode,动态规划,leetcode,算法

🕔 复杂度分析:
  • 时间复杂度 O ( n 2 ) O(n^2) O(n2),其中 n 为字符串 s 的长度。预处理计算 isPalindromic 和动态规划计算 dp 的时间复杂度均为 O ( n 2 ) O(n^2) O(n2)
  • 空间复杂度 O ( n 2 ) O(n^2) O(n2),数组isPalindromic 需要使用 O ( n 2 ) O(n^2) O(n2) 的空间, 数组 dp 需要使用 O ( n ) O(n) O(n) 的空间。

题目来源:力扣。

放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我LeetCode主页 / CSDN—力扣专栏,每日更新!文章来源地址https://www.toymoban.com/news/detail-550629.html

注: 如有不足,欢迎指正!

到了这里,关于(动态规划) 132. 分割回文串 II ——【Leetcode每日一题】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【Leetcode每日一题】 动态规划 - 地下城游戏(难度⭐⭐⭐)(61)

    【Leetcode每日一题】 动态规划 - 地下城游戏(难度⭐⭐⭐)(61)

    1. 题目解析 题目链接:174. 地下城游戏 这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。 2.算法原理 一、状态表定义 在解决地下城游戏问题时,我们首先需要对状态进行恰当的定义。一个直观的想法是,从起点开始,到达[i, j]位置时所需的最低初始

    2024年04月29日
    浏览(7)
  • ( 动态规划) 1035. 不相交的线 ——【Leetcode每日一题】

    ( 动态规划) 1035. 不相交的线 ——【Leetcode每日一题】

    难度:中等 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在,可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线,这些直线需要同时满足满足: nums1[i] == nums2[j] 且绘制的直线不与任何其他连线(非水平线)相交。 请注意,连线即使在端点也不能相交

    2024年02月05日
    浏览(10)
  • (动态规划) 剑指 Offer 42. 连续子数组的最大和 ——【Leetcode每日一题】

    (动态规划) 剑指 Offer 42. 连续子数组的最大和 ——【Leetcode每日一题】

    难度:简单 输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。 要求时间复杂度为 O(n) 。 示例1: 输入: nums = [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 提示 : 1 = a r r . l e n g t h = 1 0 5 1 = arr.length = 10^

    2024年02月11日
    浏览(11)
  • (动态规划) 剑指 Offer 60. n个骰子的点数 ——【Leetcode每日一题】

    (动态规划) 剑指 Offer 60. n个骰子的点数 ——【Leetcode每日一题】

    难度:中等 把 n 个骰子扔在地上,所有骰子朝上一面的点数之和为 s 。输入 n ,打印出s的所有可能的值出现的概率。 你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。 示例 1: 输入: 1 输出: [0.16667,0.16667,0.16667,

    2024年02月11日
    浏览(8)
  • ( 动态规划) 674. 最长连续递增序列 / 718. 最长重复子数组——【Leetcode每日一题】

    ( 动态规划) 674. 最长连续递增序列 / 718. 最长重复子数组——【Leetcode每日一题】

    难度:简单 给定一个未经排序的整数数组,找到最长且 连续递增的子序列 ,并返回该序列的长度。 连续递增的子序列 可以由两个下标 l 和 r(l r) 确定,如果对于每个 l = i r ,都有 nums[i] nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] 就是连续递增子序列。

    2024年02月05日
    浏览(11)
  • (动态规划) 剑指 Offer 10- I. 斐波那契数列 ——【Leetcode每日一题】

    (动态规划) 剑指 Offer 10- I. 斐波那契数列 ——【Leetcode每日一题】

    难度:简单 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N) )。斐波那契数列的定义如下: F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - 2), 其中 N 1. 斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。 答案需要取模 1e9+7(1000000007),如计

    2024年02月12日
    浏览(10)
  • 【LeetCode每日一题】2645. 构造有效字符串的最少插入数(计算组数+动态规划+考虑相邻字母)

    【LeetCode每日一题】2645. 构造有效字符串的最少插入数(计算组数+动态规划+考虑相邻字母)

    2024-1-11 2645. 构造有效字符串的最少插入数 方法一:计算组数 1.用count统计,能构成几组abc 2.如果当前字符大于之前字符,说明还在组内,不更新 3.如果当前字符小于等于之前字符,说明不是同一组的abc,组数更新 4.最终返回值:组数*3,再减去原本的字符数,就是要插入的次数

    2024年01月17日
    浏览(7)
  • (动态规划) 剑指 Offer 48. 最长不含重复字符的子字符串 ——【Leetcode每日一题】

    (动态规划) 剑指 Offer 48. 最长不含重复字符的子字符串 ——【Leetcode每日一题】

    难度:中等 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 示例 1: 输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2: 输入: “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “b”,所

    2024年02月11日
    浏览(15)
  • ( 字符串) 647. 回文子串 ——【Leetcode每日一题】

    ( 字符串) 647. 回文子串 ——【Leetcode每日一题】

    难度:中等 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串

    2024年02月01日
    浏览(9)
  • LeetCode·每日一题·1177. 构建回文串检测·前缀和

    LeetCode·每日一题·1177. 构建回文串检测·前缀和

    作者:小迅 链接:https://leetcode.cn/problems/can-make-palindrome-from-substring/solutions/2309940/qian-zhui-he-zhu-shi-chao-ji-xiang-xi-by-n3ps/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。   题意 - 给定一个字符串,选择其中任意位置 L-R,可以重

    2024年02月09日
    浏览(4)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包