[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; }
作者:Leo-Yang
原文都先发布在作者个人博客:http://www.leoyang.net/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.