QUESTION:
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"]
]
EXPLANATION:
还是一个backtracking的问题。首先是
用aab来举例的话。
a是一个palindrome,所以把剩下的进行判断,那就是ab
ab中的a是一个palindrome,剩下的b进行判断
b也是palindrome,所以是一个正解,添加到集合中。
这个时候回到第一个a,剩下的ab不是palindrome,所以a,ab不是正解。
aa,b也是一个正解,aab不是正解。
由上面的步骤可以总结归纳得到。
SOLUTION:
class Solution {
public List<List<String>> partition(String s) {
List<List<String>> result = new ArrayList<>();
List<String> subset = new ArrayList<>();
partitionHelper(s,result,subset,0);
return result;
}
public void partitionHelper(String s,List<List<String>> result,List<String> subset,int start) {
if(start == s.length()) result.add(new ArrayList<>(subset));
else{
for(int i = start;i<s.length();i++){
String tmp = s.substring(start,i+1);
if(isPalindrome(tmp)){
subset.add(tmp);
partitionHelper(s,result,subset,i+1);
subset.remove(subset.size()-1);
}
}
}
}
public static boolean isPalindrome(String s) {
if(s == null) return true;
String ns = s.toLowerCase();
char[] chars = ns.toCharArray();
ArrayList<Character> list = new ArrayList<>();
for(char c : chars){
if((c>='a'&& c<='z') || (c>='0' && c<='9') || (c>='A' && c<='Z'))
list.add(c);
}
Object[] objects = list.toArray();
int pre = 0;int after = objects.length-1;
while (pre<after){
char head = (char) objects[pre];
char end = (char) objects[after];
if(head!=end)
return false;
pre++;
after--;
}
return true;
}
}