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

wuchangjian2021-11-15 14:54:43编程学习

题目:
给定一个字符串 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++;
        }
    }
}

相关文章

JAVA用户交互Scanner

Scanner对象 之前我们学的基本语法中我们并没有实现程序和人的交互,...

Java的搜索引擎框架

1、Java 全文搜索引擎框架 Lucene Lucene是目前最受欢迎的Java全文...

第五章:数组与字符串(二)

一.字符串 (1)字符串的表示 java.lang.St...

mpls中如何ping,出现错误后的结果

mpls中如何ping,一般使用ping lsp和tracert lsp...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。