leetcode: palindrome-partitioning-ii

题目描述:

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.

解题思路:

  1. 本题的题意是求给定字符串可分割成回文串的最小分割数
  2. 这题符合多阶段决策模型,所以考虑用动态规划来求解
  3. 设置一个 dp 数组,依次截取原字符串的字串来判断当前字符串的分隔条件
  4. 设立一个单独函数来判断当前字符串是否为回文串

代码如下:

    public int minCut(String s) {
        int [] dp = new int[s.length()];

	// 依次截取前 i 个字符作为当前字符串
        for(int i = 0; i < s.length(); i++){
	
	    // 如果当前字符串是回文串,那么它的可分割数是 0,否则先假设是最大的分割数 i
            dp[i] = isHuiwen(s.substring(0,i + 1)) ? 0: i;

	    // 如果当前字符串的可分割数为 0,那么它是符合题意的解,故跳过
            if(dp[i] == 0)  continue;

	    // 如果当前字符串的可分割数不是 0,则需要依次截取当前字符串的子字符串判断
            for(int j = 1; j <= i; j++){
			
		// 如果当前字符串是回文串,那么它的可分割数就需要重新给定
                if(isHuiwen(s.substring(j,i + 1)))
				
		     // 状态转移方程
                    dp[i] = Math.min(dp[i],dp[j - 1] + 1);
		
		// 如果不是回文串,就需要重新给定值
                else
                    dp[i] = Math.min(dp[i],dp[j - 1] + i + 1 - j);
            }
        }
        return dp[dp.length - 1];
    }

    // 判断当前字符串是否为回文串
    private boolean isHuiwen(String s){
        boolean flag = true;

        int i = 0;
        int j = s.length() - 1;

        while(i < j){
            if(s.charAt(i) != s.charAt(j)){
                flag = false;
                break;
            }
            i++;
            j--;
        }
        return flag;
    }

转载于:https://my.oschina.net/happywe/blog/3080276

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值