zoukankan      html  css  js  c++  java
  • [LeetCode]Palindrome Partition

    题目说明

    Given a string s, partition s such that every substring of the partition is a palindrome.

    Return all possible palindrome partitioning of s.

    For example, given s = "aab",
    Return

      [

        ["aa","b"],

        ["a","a","b"]

      ]

    思路

    该题可以这么理解,将原字符串在k位置对分,一共有n种分法,比如aab可以分为a,ab  aa,b  aab. 对这n种分法进行考察,如果左半部分是回文串,那么只需将右半部分所有可能分法前面加上左边的回文串就是整个字符串在该点对分可能的分法。这样就把原问题缩小到搜索子串所有分法的问题。如此n种分法分下来就构成了整个字符串所有分法。拿abbab做例子:

    a,bbab => a,b,bab   a,b,b,a,b  a,bb,a,b

    ab,bab => ab不是回文串因此不考察

    abb, ab=>  aab不是回文串因此不考察

    abba,b => abba,b

    abbab => abbab不是回文串因此不考察

    显然这是一个递归的方法。另外需要注意的是为了检查某个子串是不是回文串应该用动态规划的方法记录下来。否则检查是否是回文串的时间复杂度就是n立方了。

     代码

    public ArrayList<ArrayList<String>> partition(String s) {
    
               // Note: The Solution object is instantiated only once and is reused by each test case.
    
            int n=s.length();
    
            if(n==0)
    
              return null;
    
           boolean[][] dp=new boolean[n][n];
    
           for(int i=0;i<n;i++)
    
             dp[i][i]=true;
    
           for(int l=2;l<=n;l++)
    
           for(int i=0;i<n+1-l;i++)
    
            if((l==2&&s.charAt(i)==s.charAt(i+1))||(dp[i+1][i+l-2]&&s.charAt(i)==s.charAt(i+l-1)))
    
             {
    
                
    
                   dp[i][i+l-1]=true;
    
                
    
             }
    
              return partitionHelper(s, 0,  dp);
    
           }
    
         private ArrayList<ArrayList<String>> partitionHelper(String s,int start,boolean[][] dp)
    
         {
    
            ArrayList<ArrayList<String>> ans=new ArrayList<ArrayList<String>>();
    
            if(start>=s.length())
    
             {
    
               ArrayList<String> str=new ArrayList<String>();
    
               ans.add(str);
    
               return ans;
    
             }
    
            int n=s.length()-start;
    
            for(int i=n-1;i>=0;i--)
    
            {
    
              if(dp[start][start+i])
    
               {
    
                 ArrayList<ArrayList<String>> tmp=partitionHelper(s, start+i+1, dp);
    
                 for(ArrayList<String> list:tmp)
    
                 {
    
                    list.add(0,s.substring(start,start+i+1));
    
                    ans.add(list);
    
                 }
    
              }
    
            }
    
            return ans;
    
         }
  • 相关阅读:
    OpenLayer 3 鹰眼控件和全屏显示
    OpenLayer 3 鼠标位置坐标显示控件
    Openlayer 3 图层列表控件(自定义)
    OpenLayers 3 的地图基本操作
    小米范工具系列之十四:小米范网站批量爬虫工具
    ruby所有版本下载地址
    常用代码块:使用时间生成数据库文件名
    收集些常用的正则--以后慢慢添加
    小米范工具系列最新下载地址
    小米范工具系列之十三:小米范验证码登录爆破工具
  • 原文地址:https://www.cnblogs.com/developerY/p/Palindrome_Partition.html
Copyright © 2011-2022 走看看