132. Palindrome Partitioning II

https://www.youtube.com/watch?v=vunyW9zVrx4

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",
Return 1 since the palindrome partitioning ["aa","b"] could be produced using 1 cut.

题意分析:对输入的字符串进行划分,要求划分后的所有的子字符串都是回文串,求最小划分的个数。

1.定义两个数组cus[]以及ispalindrome[][]

(1)数组cuts[i]表示将位置0到i的子串划分为回文字串最小划分个数,例如 s="aab"

 cuts[0] 表示划分"a"的最小划分个数,为0, 不需划分

cuts[1] 表示划分"aa"的最小划分个数,为0, 不需划分

cuts[2]表示划分"aab"的最小划分个数, 为1 ,划分为{aa,b}

(2)另外定义数组ispalindrome[j][i]表示字符串从位置j到位置i所表示的子字串是否为回文字串,根据回文字串的对称性质有下面等式成立:

if(charAt(i)==charAt(j) &&ispalindrome[j+1][i-1] == true)  ispalindrome[j][i] = true

2.考虑一下边界情况:

(1)当i == j时,   ispalindrome[j][i] = true

(2) 当charAt(i)==charAt(j) 且 i - j < 2时, 即i与j之间最多间隔一个字符且两边的字符相同时,此子字串为回文,ispalindrome[j][i] = true

3.计算过程

根据cuts[]定义,如果s的长度是len,则我们最终需要返回的结果是cuts[len-1]。 如何计算cuts[]?

(1)设cuts[i]的初始值为i, 即字符串按每个字符划分的个数, 一个字符不需划分,两个字符需要一次划分,以此类推。

(2)若从位置0到i的整个字串是回文,则不需要划分,即cuts[i] = 0

(3) 若从位置j(j<=i)到位置i为回文,则cuts[i] =Math.min(cuts[i], cuts[j-1] +1),即从j至i的回文做一次划分,j-1之前的字串最小划

   分为cuts[j-1]

代码如下:

class Solution {
    public int minCut(String s) {
        if(s == null|| s.length() == 0) return 0;
        int len = s.length();
        int[] cuts = new int[len];
        boolean[][] ispalindrome = new boolean[len][len];
        cuts[0] = 0;
        ispalindrome[0][0] = true;
        for(int i = 1; i < len; i++){
            int min = i;
            for(int j = 0; j <=i; j++){
                if(s.charAt(i) == s.charAt(j) &&( i-j < 2 || (j < len -1 && ispalindrome[j+1][i-1]))){
                    ispalindrome[j][i] = true;
                    min = j ==0 ? 0:Math.min(min, cuts[j-1] +1);
                }
            }
            cuts[i] = min;
        }
        return cut[len -1];
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值