其他分享
首页 > 其他分享> > 【剑指 Offer II】 094. 最少回文分割

【剑指 Offer II】 094. 最少回文分割

作者:互联网

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

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

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

注意:本题与主站 132 题相同: https://leetcode-cn.com/problems/palindrome-partitioning-ii/

答案:

class Solution {
    public int minCut(String s) {
        //换个角度想想,当切割次数最少使得切割后的所有字符串都是回文时,也正是这些回文子串最长的时候,那么如果说能找到以每个字符为中心的最长回文串,实际上就已经找到了答案。
        //dp数组存的是当前位置的最少分割次数
        if(s == null || s.length() <= 1)
            return 0;
        int len = s.length();
        int[] dp = new int[len];
        Arrays.fill(dp, len - 1);
        for(int i = 0; i < len; i++){
            minCutCount(s, i, i, dp);//奇数位中心
            minCutCount(s, i, i + 1, dp);//偶数位中心
        }
        return dp[len - 1];
    }
    public void minCutCount(String s, int i, int j, int[] dp){
        int len = s.length();
        while(i >= 0 && j < len && s.charAt(i) == s.charAt(j)){
            dp[j] = Math.min(dp[j], (i == 0 ? -1 : dp[i - 1]) + 1);
            i--;
            j++;
        }
    }
}

标签:子串,分割,Offer,int,示例,094,II,dp,回文
来源: https://blog.csdn.net/weixin_44485744/article/details/121334715