Subsets http://blog.csdn.net/u014425050/article/details/24138019
Total Accepted: 9269 Total Submissions: 36157
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"] ]
public class Solution {
// add the prefix palindrome into each (palindrome sets of remaining substring)
// aabc+X = {a+X, aa+X, aab+X, aabc+X}
public ArrayList<ArrayList<String>> partition(String s) {
return getSubsets(s, 0);
}
public static ArrayList<ArrayList<String>> getSubsets(String s, int start_index) {
ArrayList<ArrayList<String>> list = new ArrayList<ArrayList<String>>();
if (start_index == s.length()) {
list = new ArrayList<ArrayList<String>>();
list.add(new ArrayList<String>());
} else {
for (int i = start_index; i < s.length(); i++) {
if (isPalindrome(s, start_index, i)) {
String paliStr = s.substring(start_index, i+1);
// create a new sets for each iteration
ArrayList<ArrayList<String>> allSubsets = getSubsets(s, i + 1);
ArrayList<ArrayList<String>> tmpsets = new ArrayList<ArrayList<String>>();
for (ArrayList<String> set : allSubsets) {
ArrayList<String> tmp = new ArrayList<String>();
tmp.add(paliStr);
tmp.addAll(set);
tmpsets.add(tmp);
}
list.addAll(tmpsets);
}
}
}
return list;
}
public static boolean isPalindrome(String s, int lo, int hi) {
for (int i = lo, j = hi; i < j; i++, j--) {
if (s.charAt(i) != s.charAt(j)) return false;
}
return true;
}
}
public class Solution {
// check isPalindrome wit dp
public ArrayList<ArrayList<String>> partition(String s) {
ArrayList<ArrayList<String>> list = new ArrayList<ArrayList<String>>();
ArrayList<String> partition = new ArrayList<String>();
int len = s.length();
if (len == 0) return list;
int[][] dp = new int[len][len];
for (int i = 0; i < len; i++) dp[i][i] = 1;
for (int k = 1; k < len; k++) {
for (int i = 0; i < len - k; i++) {
int j = i + k;
if (((j == i+1) || (dp[i+1][j-1] == 1)) && s.charAt(i) == s.charAt(j)) dp[i][j] = 1;
}
}
dfs(s, 0, dp, list, partition);
return list;
}
public void dfs(String s, int start_index, int[][] dp, ArrayList<ArrayList<String>> list, ArrayList<String> partition) {
if (start_index == s.length()) list.add(new ArrayList<String>(partition));
else {
for (int i = start_index; i < s.length(); i++) {
partition.add(s.substring(start_index, i + 1));
if (dp[start_index][i] == 1) dfs(s, i + 1, dp, list, partition);
partition.remove(partition.size() - 1);
}
}
}
}
public class Solution {
public ArrayList<ArrayList<String>> partition(String s) {
ArrayList<ArrayList<String>> list = new ArrayList<ArrayList<String>>();
ArrayList<String> partition = new ArrayList<String>();
dfs(s, list, partition);
return list;
}
public void dfs(String s, ArrayList<ArrayList<String>> list, ArrayList<String> partition) {
if (s.length() == 0) list.add(new ArrayList<String>(partition));
else {
for (int i = 0; i < s.length(); i++) {
String str = s.substring(0, i + 1);
if (isPalindrome(str)) {
partition.add(str);
dfs(s.substring(i + 1, s.length()), list, partition);
partition.remove(partition.size() - 1);
}
}
}
}
public static boolean isPalindrome(String s) {
for (int i = 0, j = s.length() - 1; i < j; i++, j--) {
if (s.charAt(i) != s.charAt(j)) return false;
}
return true;
}
}