首页 > 其他分享 >【DP】LeetCode 132. 分割回文串 II

【DP】LeetCode 132. 分割回文串 II

时间:2023-04-20 10:23:09浏览次数:55  
标签:int ++ II 132 length checkPalindrome LeetCode dp 回文

题目链接

132. 分割回文串 II

思路

分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律

在数组的动态规划问题中,一般 dp[i] 都是表示以 nums[i] 为结尾的状态;dp[i][j] 分别表示 以 nums1[i]nums2[j] 为结尾的状态,以此类推

字符串也是个数组,是字符数组

表示状态

首先构思一下我们需要存储的信息,以此来确定 dp 数组的维数:

找状态转移方程

边界处理

代码

dp数组版

class Solution {
    public int minCut(String s) {
        int n = s.length();
        if(n < 2){
            return 0;
        }
        // dp[i]表示 s[0 : i] 符合要求的最少分割次数
        // dp[i] = min(dp[j] + 1 if s[j + 1: i] 是回文 for j in range(i))
        int[] dp = new int[n + 3];
        // 表示 s[i:j] 是否是回文串
        boolean[][] checkPalindrome = getCheckPalindromeArray(s.toCharArray());

        // 最坏情况下是每个字符单独成串,所以需要每个字符都切割,即需要切 n - 1 下
        for(int i = 0; i < n; i++){
            dp[i] = i;
        }

        // 1 个字符的时候,不用判断,因此 i 从 1 开始
        for(int i = 1; i < n; i++){
            // 如果 s[0 : i] 是回文串,那么就不用切割
            if(checkPalindrome[0][i]){
                dp[i] = 0;
                continue;
            }

            // 如果不是回文串,那么需要判断怎么切割 s[0 : i]
            for(int j = 0; j < i; j++){
                // dp[j], 即 s[0 : j] 的切割次数已经计算好了,现在只需要判断 s[j + 1 : i] 是不是回文串
                // 如果是回文串,那么 dp[i] = min(dp[i], dp[j] + 1)
                if(checkPalindrome[j + 1][i]){
                    dp[i] = Math.min(dp[i], dp[j] + 1);
                }
            }
        }

        return dp[n - 1];
    }

    public boolean[][] getCheckPalindromeArray(char[] s) {
        boolean[][] checkPalindrome = new boolean[s.length][s.length];

        for(int i = 0; i < s.length; i++){
            checkPalindrome[i][i] = true;
        }
        // 枚举每一个子串
        for(int j = 1; j < s.length; j++){
            for(int i = 0; i < j; i++){
                // 如果一个串的左右两个字符相同,且中间的子串是回文串,那么这个串就是回文串
                checkPalindrome[i][j] = (
                        (s[i] == s[j]) && ((j - i <= 2) || checkPalindrome[i + 1][j - 1])
                );
            }
        }

        return checkPalindrome;
    }
}

标签:int,++,II,132,length,checkPalindrome,LeetCode,dp,回文
From: https://www.cnblogs.com/shixuanliu/p/17335807.html

相关文章

  • leetcode_打卡08
    leetcode_打卡08题目:334.递增的三元子序列思路:分成左边L和右边R,只要找到该数左边比它小的,右边比他大的即可代码:classSolution{publicbooleanincreasingTriplet(int[]nums){intn=nums.length;int[]L=newint[n];int[]R=newint[n];......
  • [Leetcode]合并两个有序链表
    力扣链接依次比较,取小的尾插:初步代码:/***Definitionforsingly-linkedlist.*structListNode{*intval;*structListNode*next;*};*/structListNode*mergeTwoLists(structListNode*list1,structListNode*list2){structListNode*......
  • #yyds干货盘点# LeetCode面试题:搜索旋转排序数组 II
    1.简述:已知存在一个按非降序排列的整数数组nums,数组中的值不必互不相同。在传递给函数之前,nums在预先未知的某个下标k(0<=k<nums.length)上进行了旋转,使数组变为[nums[k],nums[k+1],...,nums[n-1],nums[0],nums[1],...,nums[k-1]](下标从0开始计数)。例如,[0,1,2......
  • #yyds干货盘点# LeetCode程序员面试金典:串联所有单词的子串
    题目:给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串长度相同。 s 中的串联子串是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。例如,如果 words=["ab","cd","ef"],那么 "abcdef", "abefcd","cdabef", "cdefab","efabcd",......
  • 35. 搜索插入位置(leetcode)
    https://leetcode.cn/problems/search-insert-position/简单二分,这里可以判断return,相当于剪枝这里的写法最后更新后的l或r一定可以使得nums[l]或者nums[r]>=target所以退出循环最后的l或r就是第一个大于等于target的下标classSolution{public:intsearchInsert(vect......
  • 704. 二分查找(leetcode)
    https://leetcode.cn/problems/binary-search/简单二分classSolution{public:intsearch(vector<int>&nums,inttarget){intl=0,r=nums.size()-1;while(l<r){intmid=l+r>>1;if(nums[mid]......
  • 浪潮信息等企业评审通过OTII-E模块化服务器技术规范V1.0
    ■■ 近期,ODCC服务器工作组组织线上评审会议,评审通过了《OTII-E模块化服务器技术规范V1.0》。评审会议上,浪潮信息、英特尔、中国信通院等相关单位的近50位专家参与了在线评审,深入讨论目前OTII系列标准发展的关键问题、行业价值和发展方向。OTII-E是OTII系列标准中的最新技术规范,将......
  • 递归-leetcode 114
    给你二叉树的根结点 root ,请你将它展开为一个单链表:展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。示例1:输入:root=[1,2,5,3,4,null,6]输出:[1,null,2,null,3,nu......
  • day 50 123.买卖股票的最佳时机III
    给定一个数组,它的第i个元素是一支给定的股票在第i天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。一天一共就有五个状态,没有操作(其实我们也可以不设置这个状态)第一次......
  • 【DP】LeetCode 题号.题目
    题目链接377.组合总和Ⅳ思路分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律在数组的动态规划问题中,一般dp[i]都是表示以nums[i]为结尾的状态;dp[i][j]分别表示以nums1[i]和nums2[j]为结尾的状态,以此类推......