给定一个字符串,求可以把它拆分多个回文字串的所有可能情况(leetcode131):
Given a string s, partition s such that every substring of the partition is a palindrome.
Return all possible palindrome partitioning of s.
Example:
Input: "aab" Output: [ ["aa","b"], ["a","a","b"] ]
思路:利用递归回溯暴力破解。对于每一给定的字符串,从其开始位置进行判断,遍历其可以拆分的子串的,在每个是回文串的情况下,递归调用其剩余的子字符串。递归的出口就是已经遍历到字符串的最后一个字符了,对于最后一个字符,它一定是回文串。记得调用结束要进行回溯,因为下次要遍历的是长度+1的字符串了。
public class L131PalindromePartitioning {
static List<List<String>> res = new ArrayList<List<String>>();
public static void main(String[] args) {
System.out.println(partition("aab"));
}
public static List<List<String>> partition(String s) {
helper(s,0,new ArrayList<String>());
return res;
}
public static void helper(String s,int index,List<String> list ){
System.out.println("list:"+list);
System.out.println("s:"+s);
if( list.size() > 0 && index >= s.length()){
ArrayList<String> temp = new ArrayList<String>(list);
res.add(temp);
}
for(int i = index; i < s.length(); i++){
if(isPalindrome(s,index,i)){
if(index == i){
list.add(Character.toString(s.charAt(i)));
}else{
list.add(s.substring(index, i+1));
}
helper(s,i+1,list);
list.remove(list.size()-1);
}
}
}
public static boolean isPalindrome(String str, int l, int r){
if(l==r) return true;
while(l<r){
if(str.charAt(l)!=str.charAt(r)) return false;
l++;r--;
}
return true;
}
}