zoukankan      html  css  js  c++  java
  • 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. 

  • 相关阅读:
    学习Mybatis中的一对多表关联
    学习Mybatis中的一对一表关联
    学习Mybatis中的动态sql
    学习Mybatis中的约定大于配置、数据库配置优化、定义别名、类型处理器、resultMap和parameterType
    第八周进度
    构建之法阅读笔记07
    正则表达式
    梦断代码之阅读笔记02
    顶会热词统计
    本周进度
  • 原文地址:https://www.cnblogs.com/Dylan-Java-NYC/p/4824961.html
Copyright © 2011-2022 走看看