好的参考文献:
http://blog.csdn.net/yutianzuijin/article/details/16850031
对于Partitioning I
public ArrayList<ArrayList<String>> partition(String s) {
ArrayList<ArrayList<String>> result = new ArrayList<ArrayList<String>>();
if (s == null || s.length() == 0) {
return result;
}
ArrayList<String> partition = new ArrayList<String>();
addPalindrome(s, 0, partition, result);
return result;
}
private void addPalindrome(String s, int start, ArrayList<String> partition,
ArrayList<ArrayList<String>> result) {
//stop condition
if (start == s.length()) {
ArrayList<String> temp = new ArrayList<String>(partition);
result.add(temp);
return;
}
for (int i = start + 1; i <= s.length(); i++) {
String str = s.substring(start, i);
if (isPalindrome(str)) {
partition.add(str);
addPalindrome(s, i, partition, result);
partition.remove(partition.size() - 1);
}
}
}
private boolean isPalindrome(String str) {
int left = 0;
int right = str.length() - 1;
while (left < right) {
if (str.charAt(left) != str.charAt(right)) {
return false;
}
left++;
right--;
}
return true;
}
public class Solution {
public ArrayList<ArrayList<String>> partition(String s) {
ArrayList<ArrayList<String>> result = new ArrayList<ArrayList<String>>();
if (s == null) {
return result;
}
ArrayList<String> path = new ArrayList<String>();
helper(s, path, 0, result);
return result;
}
private boolean isPalindrome(String s) {
int beg = 0;
int end = s.length() - 1;
while (beg < end) {
if (s.charAt(beg) != s.charAt(end)) {
return false;
}
beg++;
end--;
}
return true;
}
private void helper(String s, ArrayList<String> path, int pos,
ArrayList<ArrayList<String>> result) {
if (pos == s.length()) {
result.add(new ArrayList<String>(path));
return;
}
for (int i = pos + 1; i <= s.length(); i++) {
String prefix = s.substring(pos, i);
if (!isPalindrome(prefix)) {
continue;
}
path.add(prefix);
helper(s, path, i, result);
path.remove(path.size() - 1);
}
}
}