leetcode题解132-分割回文串 II

问题描述

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

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

示例 1:

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

示例 2:

输入:s = "a"
输出:0

示例 3:

输入:s = "ab"
输出:1
 

提示:

1 <= s.length <= 2000
s 仅由小写英文字母组成

解题思路

设 f[i]表示字符串的前缀 s[0…i]的最少分割次数。要想得出 f[i] 的值,我们可以考虑枚举 s[0…i]分割出的最后一个回文串,这样我们就可以写出状态转移方程:
在这里插入图片描述
即我们枚举最后一个回文串的起始位置 j+1,保证 s[j+1…i]是一个回文串,那么 f[i]就可以从 f[j]转移而来,附加 1次额外的分割次数。

注意到上面的状态转移方程中,我们还少考虑了一种情况,即 s[0…i]本身就是一个回文串。此时其不需要进行任何分割,即:

f[i]=0

那么我们如何知道 s[j+1…i]或者 s[0…i]是否为回文串呢?我们可以使用与leetcode题解5-最长回文子串中相同的预处理方法,将字符串 ss 的每个子串是否为回文串预先计算出来,即:

代码实现

class Solution {
    
    
    public boolean f[][];     //判断以i为起点,j为终点的字符串是否是回文串
    public int n;             //字符串s的长度
    public int dp[];          //dp[i]表示以i为最后一个元素的子字符串的最少分割次数
    public int minCut(String s) {
    
    
        n=s.length();
        //按最长回文子串的思路填充f[][]
        f=new boolean[n][n];
        if(n==0 || n==1){
    
    
            return 0;
        }
        char []cs=s.toCharArray();
        for(int i=0;i<n;i++){
    
    
            for(int j=0;j<=i;j++){
    
    
                if(i-j<=1){
    
    
                    if(cs[i]==cs[j]){
    
    
                        f[j][i]=true;
                    }
                }else{
    
    
                    if(cs[i]==cs[j] && f[j+1][i-1]==true){
    
    
                        f[j][i]=true;
                    }
                }
            }
        }
        dp=new int[n];
        //计算以每个元素为后缀的子字符串的最少分割次数
        for(int i=0;i<n;i++){
    
    
            dp[i]=i;    //最坏情况下,默认每个字符都要分割
            //如果从第一个元素一直到最后一个元素都是回文子串,那么最少分割次数是0
            if(f[0][i]==true){
    
      
                dp[i]=0;
                continue;
            }
            //否则的话,从前往后遍历,如果从j+1到i可以组成一个回文子串
            //那么最少分割次数就等于0到j的最少分割次数+1
            for(int j=0;j<i;j++){
    
    
                if(f[j+1][i]==true){
    
    
                    dp[i]=Math.min(dp[j]+1,dp[i]);
                }
            }
        }
        //最终返回dp[n-1]
        return dp[n-1];
    }
    
}

猜你喜欢

转载自blog.csdn.net/qq_39736597/article/details/114542203