• LeetCode 132. Palindrome Partitioning II


    原题链接在这里:https://leetcode.com/problems/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",
    Return 1 since the palindrome partitioning ["aa","b"] could be produced using 1 cut.

    题解:

    求的是至少切几刀能全是palindrome.

    Let dp[j] denotes up to i 最少 能分成几块palindrome.

    For all 0 <= i <= j 如果[i,j]段是palindrome, 到j点结束那段就可以从 到i点结束那段+1 来跟新最小值.

    初始化至少每个字母都分开肯定都是palindrome了.

    答案dp[n]-1. 最少分成的块数 比切的刀数 多一.

    用二维array来matin [i, j]段是否是palindrome. 两边闭区间,包括i,j对应的char. This could hep reduce running time from O(n^3) to O(n^2).

    Time Complexity: O(n^2). n = s.length().

    Space: O(n^2).

    AC Java:

     1 class Solution {
     2     public int minCut(String s) {
     3         if(s == null || s.length() == 0){
     4             return 0;
     5         }
     6         
     7         int n = s.length();
     8         boolean [][] isPal = preCal(s);
     9         int [] dp = new int[n+1];
    10         
    11         for(int j = 0; j<n; j++){
    12             dp[j+1] = j+1;
    13             for(int i = 0; i<=j; i++){  //error
    14                 if(isPal[i][j]){
    15                     dp[j+1] = Math.min(dp[j+1], dp[i]+1);
    16                 }
    17             }
    18         }
    19         
    20         return dp[n]-1;
    21     }
    22     
    23     private boolean [][] preCal(String s){
    24         int n = s.length();
    25         boolean [][] res = new boolean[n][n];
    26         for(int j = 0; j<n; j++){
    27             for(int i = j; i>=0; i--){
    28                 if(s.charAt(i) == s.charAt(j) && (j-i<2 || res[i+1][j-1])){     //error
    29                     res[i][j] = true;
    30                 }
    31             }
    32         }
    33         
    34         return res;
    35     }
    36 }

    对每一个点按照奇数和偶数两种方式 左右延展若是palindrome就更新dp array. 若不是就停止.

    Time Complexity: O(n^2).

    Space: O(n).

    AC Java: 

     1 class Solution {
     2     public int minCut(String s) {
     3         if(s == null || s.length() == 0){
     4             return 0;
     5         }
     6         
     7         int len = s.length();
     8         int [] dp = new int[len+1];
     9         for(int i = 0; i<=len; i++){
    10             dp[i] = i-1;
    11         }
    12         for(int i = 0; i<len; i++){
    13             // odd length palindrome
    14             for(int l = i, r = i; l>=0 && r<len && s.charAt(l)==s.charAt(r); l--, r++){
    15                 dp[r+1] = Math.min(dp[r+1], dp[l]+1);
    16             }
    17             
    18             // even length palindrome
    19             for(int l = i, r = i+1; l>=0 && r<len && s.charAt(l)==s.charAt(r); l--, r++){
    20                 dp[r+1] = Math.min(dp[r+1], dp[l]+1);
    21             }
    22         }
    23         return dp[len];
    24     }
    25 }

    类似Word Break. 

  • 相关阅读:
    poj2229 Sumsets (递推)
    hihocoder1148 February 29(区间闰年计数)
    sort函数比较cmp写法
    字符串忽略大小写
    地形
    启用和禁用warning
    AppStore SDK
    NGUI List优化
    ETC1
    加载
  • 原文地址:https://www.cnblogs.com/Dylan-Java-NYC/p/4824961.html
Copyright © 2020-2023  润新知