zoukankan      html  css  js  c++  java
  • leetcode]Palindrome Partitioning IIMar

     
    Palindrome Partitioning IIMar 

    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) 初次尝试:在解决这个问题的时候,我第一反映是用贪婪算法,从头到尾遍历s,找出回文,但是事实上这样得不到最少的分割。例如:

    ababbbabbaba

    贪心算法得到的结果将是:aba,bbb,abba,b,a

    函数返回的结果是4,即需要4次分割。但是更少的分割:

    aba,b,bbabb,aba

    需要三次分割。

    2) 重新思考这个问题,翻阅了“算法导论”的动态规划章节,发现这个求最优解的问题也可以用动态规划的方法解决。

    -----------------------------------------------------------------

    input:

        x[0...n-1],

    c(x, i):

        minimum cuts needed for a palindrome partitioning of x[0...i], initialize to be MAX.INT

    recursion:

        c(x, i) = min{c(x, j) + 1, c(x, i)}, 0 ≤ i < j ≤ n-1, if c[i...j] is a palindrome

    return:

        c(x, n-1): minimum cuts needed for a palindrome partitioning of x, also the return value,

    dp[i, j]:

        = true, if x[i...j] is palindrome; = false, else

    -----------------------------------------------------------------

    package Palindrome.Partitioning.II;
    
    public class net_ex1 {
    	public int minCut(String s) {
    		// Start typing your Java solution below
    		// DO NOT write main() function
    		int n = s.length();
    
    		// cut[i]表示s[i..n-1]需要的最小的切割
    		// p[i][j]表示s[i..j]是否是回文
    		int cut[] = new int[n + 1];
    		boolean p[][] = new boolean[n][n];
    
    		for (int i = 0; i < n; i++) {
    			cut[i] = Integer.MAX_VALUE;
    			p[i][i] = true;// 肯定是回文
    		}
    		cut[n] = -1;
    
    		for (int i = n - 1; i >= 0; i--) {
    			for (int j = i; j < n; j++) {
    				p[i][j] = ((s.charAt(i) == s.charAt(j)) && (j - i + 1 <= 2 || p[i + 1][j - 1]));// 判断回文,也是一个递归
    				if (p[i][j]) {
    					cut[i] = Math.min(cut[i], cut[j + 1] + 1);
    				}
    			}
    		}
    
    		return cut[0];
    	}
    
    	public static void main(String args[]) {
    		String t1 = "adabdcaebdcebdcacaaaadbbcadabcbeabaadcbcaaddebdbddcbdacdbbaedbdaaecabdceddccbdeeddccdaabbabbdedaaabcdadbdabeacbeadbaddcbaacdbabcccbaceedbcccedbeecbccaecadccbdbdccbcbaacccbddcccbaedbacdbcaccdcaadcbaebebcceabbdcdeaabdbabadeaaaaedbdbcebcbddebccacacddebecabccbbdcbecbaeedcdacdcbdbebbacddddaabaedabbaaabaddcdaadcccdeebcabacdadbaacdccbeceddeebbbdbaaaaabaeecccaebdeabddacbedededebdebabdbcbdcbadbeeceecdcdbbdcbdbeeebcdcabdeeacabdeaedebbcaacdadaecbccbededceceabdcabdeabbcdecdedadcaebaababeedcaacdbdacbccdbcece";
    		net_ex1 n = new net_ex1();
    
    		System.out.println(n.minCut(t1));
    	}
    
    }
    
  • 相关阅读:
    Android之剑法初略:dalvik vm和jvm比较
    人民币阿拉伯数字转换为汉字大写 code
    数据库定时备份方案及实践
    [postfix]添加黑名单
    [php][随机数]曲线式的随机
    记公司服务器维护经历
    批量修改符号链接实现思路
    复杂数组的签名生成方法
    [已解决]ubuntu下chrome和firefox输入框内无法快捷键全选
    [已解决]centos6.4 php连接mysql和memcache提示权限不允许
  • 原文地址:https://www.cnblogs.com/luweiseu/p/3050540.html
Copyright © 2011-2022 走看看