• 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.

    这个两个Dp, 一个是对那一部分是palindrome的二维dp。 还有一个是 对cut个数的一维dp。

     1 public class Solution {
     2     int[][] map = null;
     3     public int minCut(String s) {
     4         // IMPORTANT: Please reset any member data you declared, as
     5         // the same Solution instance will be reused for each test case.
     6         map = new int[s.length()][s.length()];
     7         int[] cut = new int[s.length()];
     8         for(int i = 0; i < s.length(); i++)
     9             map[i][i] = 1;
    10         for(int i = 0; i < s.length() - 1; i ++){
    11             if(s.charAt(i) == s.charAt(i + 1)) map[i][i + 1] = 1;
    12             else map[i][i + 1] = -1;
    13         }
    14         for(int i = 0; i < s.length(); i ++){
    15             cut[i] = i;
    16             for(int j = i; j < s.length(); j ++){
    17                 map[i][j] = checkPartition(s, i, j);
    18             }
    19         }
    20         for(int j = 0; j < s.length(); j ++){
    21             for(int i = 0; i < j; i ++){
    22                 if(map[i][j] == 1) cut[j] = Math.min(cut[j], 1 + cut[i]);
    23             }
    24         }
    25         return cut[s.length() - 1];
    26     }
    27     public int checkPartition(String s, int start, int end){
    28         if(map[start][end] != 0) return map[start][end];
    29         if(s.charAt(start) != s.charAt(end)) return -1;
    30         return checkPartition(s, start + 1, end - 1);
    31     }
    32 }
     1 public class Solution {
     2     public int minCut(String s) {
     3         int leng = s.length();
     4         if(leng == 0 || leng == 1) return 0;
     5         boolean[][] isPal = new boolean[leng][leng];
     6 
     7         int[] dp = new int[leng]; 
     8         for (int i = 0; i < leng; i++) {
     9             dp[i] = leng - 1 - i;
    10         }
    11 
    12         for (int i = leng - 1; i >= 0; --i) {
    13             for (int j = i; j < leng; ++j) {
    14                 if (s.charAt(i) == s.charAt(j) && (j <= i + 2 || (i + 1 < leng && j - 1 >= 0 && isPal[i + 1][j - 1]))) {
    15                     isPal[i][j] = true;
    16                     if(j+1 < leng){
    17                         dp[i] = Math.min(dp[i], 1 + dp[j + 1]);
    18                     }else {
    19                         dp[i] = 0;
    20                     }
    21                 }
    22             }
    23         }
    24 
    25         return dp[0];
    26     }
    27 }
  • 相关阅读:
    数据库连接池
    Apache- DBUtils框架学习
    权限表的设计
    Java的I/O对文件的操作
    Java下载文件
    Java连接MySQL数据库
    C#用log4net记录日志
    C#多线程和线程池
    C#利用反射动态调用DLL并返回结果,和获取程序集的信息
    CephRGW 在多个RGW负载均衡场景下,RGW 大文件并发分片上传功能验证
  • 原文地址:https://www.cnblogs.com/reynold-lei/p/3442649.html
Copyright © 2020-2023  润新知