[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;

     }

 

posted on 2013-10-30 11:21  Leo-Yang  阅读(339)  评论(0编辑  收藏  举报

导航

转载请注明出处