132. 分割回文串 II

简介: 132. 分割回文串 II

题目

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

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

示例 1:

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/palindrome-partitioning-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

动态规划,从左到右模型
在这里插入图片描述
尝试的是每一个作为切出来的第1部分,所有的可能性
在这里插入图片描述
dp[i]从出发后面所有的字符串至少分成几个部分让每个部分都是回文
在这里插入图片描述
不优化的化为O(n^3^)
需要优化检查回文的逻辑

预处理表

在这里插入图片描述
生成一个map,告诉你从i到j是否为回文
构建正方形表
在这里插入图片描述
填好第一条对角线和第二条对角线
在这里插入图片描述
普遍位置
mapl=str[l]==str[r]&&mapl+1

     boolean[][] isMap=new boolean[n][n];
     for(int i=0;i<n-1;i++){
         isMap[i][i]=true;
         isMap[i][i+1]=str[i]==str[i+1];
     }
     isMap[n-1][n-1]=true;
     for(int i=n-3;i>=0;i--){
         for(int j=i+2;j<n;j++){
             isMap[i][j]=(str[i]==str[j]&&isMap[i+1][j-1]);
         }
     }

代码

class Solution {
    public int minCut(String s) {
        char[] str=s.toCharArray();
        int n=str.length;
        if(n==0||n==1){
            return 0;
        }
        boolean[][] isMap=new boolean[n][n];
        for(int i=0;i<n-1;i++){
            isMap[i][i]=true;
            isMap[i][i+1]=str[i]==str[i+1];
        }
        isMap[n-1][n-1]=true;
        for(int i=n-3;i>=0;i--){
            for(int j=i+2;j<n;j++){
                isMap[i][j]=(str[i]==str[j]&&isMap[i+1][j-1]);
            }
        }
        int[] dp=new int[n];
        for(int i=n-1;i>=0;i--){
            if(isMap[i][n-1]){
                dp[i]=1;
            }else{
                int next=Integer.MAX_VALUE;
                for(int j=i;j<n;j++){
                    if(isMap[i][j]){
                        next=Math.min(dp[j+1],next);
                    }
                }
                dp[i]=next+1;
            }
        }
        return dp[0]-1;
    }
}
相关文章
|
1月前
|
机器学习/深度学习 算法 JavaScript
【动态规划】【回文】【字符串】1278分割回文串 III
【动态规划】【回文】【字符串】1278分割回文串 III
|
6月前
|
算法 测试技术 C++
C++算法:分割回文串
C++算法:分割回文串
|
1月前
|
C++ Python Java
C/C++每日一练(20230430) 分割回文串、六角填数、查找书籍
C/C++每日一练(20230430) 分割回文串、六角填数、查找书籍
34 0
C/C++每日一练(20230430) 分割回文串、六角填数、查找书籍
|
1月前
|
Java
leetcode-131:分割回文串
leetcode-131:分割回文串
25 1
|
1月前
|
Java API C++
leetcode-151:翻转字符串里的单词
leetcode-151:翻转字符串里的单词
39 0
|
1月前
|
存储 算法 程序员
【算法训练-字符串 一】【子串问题】最长无重复子串、最长回文子串、最长公共前缀
【算法训练-字符串 一】【子串问题】最长无重复子串、最长回文子串、最长公共前缀
48 0
|
7月前
倒置字符串(倒置单词,标点不倒置)
倒置字符串(倒置单词,标点不倒置)
34 0
|
存储 算法 前端开发
前端算法-回文串分割
前端算法-回文串分割
|
算法
1304 字符串的相似度 后缀数组
1304 字符串的相似度 后缀数组
53 0
leetcode 131分割回文串
leetcode 131分割回文串
63 0
leetcode 131分割回文串