zoukankan      html  css  js  c++  java
  • leetcode 131 Palindrome Pairs

    lc131 Palindrome Pairs

    解法1:

    递归

    观察题目,要求,将原字符串拆成若干子串,且这些子串本身都为Palindrome

    那么挑选cut的位置就很有意思,后一次cut可以建立在前一次cut的基础上

    举例来说

    "aab"

    第一次cut"a" "ab"

    第二次cut"a" "b"

    很容易总结出规律,s(i, j)被i=<k<j,截断

    若s(i,k)本身就是palindrome,那么我们只需要将s(i,k) 与s(k+1, j)的所有满足题目要求的子串组合,分别组合即可。

    怎么求这些子串组合呢?递归解即可

     1 class Solution {
     2     public List<List<String>> partition(String s) {
     3         List<List<String>> res = new ArrayList<>();
     4         
     5         if(s.length() == 0)
     6             return res;
     7         if(s.length() == 1){
     8             res.add(Arrays.asList(s));
     9             return res;
    10         }
    11         
    12         for(int i=0; i<s.length(); i++){
    13             int x=0, y=i;
    14             boolean preIsP = true;
    15             while(x < y){
    16                 if(s.charAt(x++) != s.charAt(y--)){
    17                     preIsP = false;
    18                     break;
    19                 }
    20             }
    21             
    22             if(preIsP){
    23                 List<List<String>>laterRes = partition(s.substring(i+1));
    24                 String pre = s.substring(0, i+1);
    25                 for(int j=0; j < laterRes.size(); j++){
    26                     
    27                     List<String> tmp = new ArrayList<>(laterRes.get(j));
    28                     tmp.add(0, pre);
    29                     res.add(tmp);
    30                 }
    31                 if(i == s.length()-1){
    32                     List<String> tmp = new ArrayList<>();
    33                     tmp.add(0, pre);
    34                     res.add(tmp);
    35                 }
    36             }
    37         }
    38         return res;
    39     }
    40 }

    解法2:

    dp解

    这里要用到两个dp

    一个一维pre[],表达s(0~i-1)所有满足题目的要求的结果

    一个二维dp[][],表达s(i~j)是否为一个palindrome

    更新方程:

    若i和j相等,则需要看子串i+1~j-1是否为palindrome

    当j-i<=1时,不存在子串,所以要考虑这种情况,加上一个||

    if(s.charAt(i) == s.charAt(j)) && (dp[i+1][j-1] || j-i <=1)

      dp[i][j] == true

    若s(i~j)已经是palindrome了,那么只需要把s(i~j)和所有满足条件的s(0~i-1)结果组合即可得到答案

    所以要遍历pre[i]

    把所有   {pre[i]中存放的结果  + s(i~j) }加入pre[i+1]

    最后返回pre(s.length());

     1 class Solution {
     2     public List<List<String>> partition(String s) {
     3         List<List<String>>[] pre = new List[s.length()+1];
     4         pre[0] = new ArrayList<List<String>>();
     5         pre[0].add(new ArrayList<String>());
     6         
     7         boolean[][] isP = new boolean[s.length()][s.length()];
     8         
     9         for(int i=0; i<s.length(); i++){
    10             pre[i+1] = new ArrayList<List<String>>();
    11             for(int j=0; j<=i; j++){
    12                 if(s.charAt(i) == s.charAt(j) && (i-j <= 1 || isP[j+1][i-1])){
    13                     isP[j][i] = true;
    14                     String str = s.substring(j, i+1);
    15                     for(List<String> tmp : pre[j]){
    16                         List<String> tmp2 = new ArrayList<>(tmp);
    17                         tmp2.add(str);
    18                         pre[i+1].add(tmp2);
    19                     }
    20                 }
    21             }
    22         }
    23         return pre[s.length()];
    24         
    25         
    26     }
    27 }
  • 相关阅读:
    2020牛客暑期多校训练营(第二场)G-Greater and Greater bitset
    2020牛客暑期多校训练营(第二场)H Happy Triangle 线段树
    平衡树——splay
    动态规划之状态压缩
    动态规划入门理解
    快速幂入门
    最小生成树初步
    线性筛素数
    最短路径—迪杰斯特拉算法入门
    并查集初步
  • 原文地址:https://www.cnblogs.com/hwd9654/p/11064248.html
Copyright © 2011-2022 走看看