回文串分割

回文串分割(Palindrome Partitioning)

难度:Hard
备注:回文串知识,出自leetcode
题目描述
Given a string s, partition s such that every substring of the partition is a palindrome.
Return the minimum cuts needed for a palindrome partitioning of s.
For example, given s =“aab”, Return1since the palindrome partitioning[“aa”,“b”]could be produced using
1 cut.
int minCut(string s)
来源:牛客-leetcode
来源:力扣:132 回文串分割II
在这里插入图片描述

  • 回文串:正读和反读都一样的字符串,比如noon,level,字符串左右对称
  • 题目描述:
    给定一个字符串 s,把 s 分割成一系列的子串,分割的每一个子串都为回文串
    返回最小的分割次数
    比如,给定 s = “aab”,
    返回1,因为一次cut就可以产生回文分割[“aa”,“b”]
  • 方法:动态规划
  • 状态:
    子状态:到第1,2,3,…,n个字符需要的最小分割数
    F(i): 到第i个字符需要的最小分割数
  • 状态递推:
    F(i) = min{F(i), 1 + F(j)}, where j<i && j+1到i是回文串
    上式表示如果从j+1到i判断为回文字符串,且已经知道从第1个字符
    到第j个字符的最小切割数,那么只需要再切一次,就可以保证
    1–>j, j+1–>i都为回文串。
  • 初始化:
    F(i) = i - 1
    上式表示到第i个字符需要的最大分割数
    比如单个字符只需要切0次,因为单子符都为回文串
    2个字符最大需要1次,3个2次…
  • 返回结果:F(n)

代码:

import java.util.*;

/**
 * 方法:动态规划
 * 状态:
 *      子状态:到第1,2,3,...,n个字符需要的最小分割数
 *      F(i): 到第i个字符需要的最小分割数
 * 状态递推:
 *      F(i) = min{F(i), 1 + F(j)}, where j<i && j+1到i是回文串
 *      上式表示如果从j+1到i判断为回文字符串,且已经知道从第1个字符
 *      到第j个字符的最小切割数,那么只需要再切一次,就可以保证
 *      1-->j, j+1-->i都为回文串。
 * 初始化:
 *      F(i) = i - 1
 *      上式表示到第i个字符需要的最大分割数
 *      比如单个字符只需要切0次,因为单子符都为回文串
 *      2个字符最大需要1次,3个2次......
 * 返回结果:
 *      F(n)
 */

public class Solution {
    /**
     * 
     * @param s string字符串 
     * @return int整型
     */
    public int minCut (String s) {
        // write code here
        if (s == null) return 0;
        if (isPal(s, 0, s.length() - 1)) return 0;
        int[] minCut = new int[s.length() + 1];
        // F(i)初始化
        // F(0)= -1,必要项,如果没有这一项,对于重叠字符串 "aaaaa" 会产生错误的结果
        for (int i = 0; i <= s.length(); i++) {
            minCut[i] = i - 1;
        }
        for (int i = 1; i <= s.length(); i++) {
            for (int j = 0; j < i; j++) {
                // F(i) = min{F(i), F(j) + 1}, where j<i && j+1到i是回文串
                // 从最长串判断,如果从第j+1到i为回文字符串
                // 则再加一次分割,从1到j,j+1到i的字符就全部分成了回文字符串
                // j + 1 个字符索引是 j ,第 i 个字符索引是 i - 1
                if (isPal(s, j, i - 1)) {
                    minCut[i] = Math.min(minCut[i], minCut[j] + 1);
                }
            }
        }
        return minCut[s.length()];
    }

    //回文串的判定
    public boolean isPal(String s, int start, int end) {
        while (start < end) {
            if (s.charAt(start) != s.charAt(end)) {
                return false;
            }
            start++;
            end--;
        }
        return true;
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值