class Solution {
public List<List<String>> partition(String s) {
Map<Integer, List<List<String>>> map = new HashMap<Integer, List<List<String>>>();
return dfs(s, 0, map);
}
private List<List<String>> dfs(String s, int start, Map<Integer, List<List<String>>> map) {
List<List<String>> res = new ArrayList<List<String>>();
int len = s.length();
if (start == len) {
res.add(new ArrayList<>());
return res;
}
// memorization
if (map.containsKey(start)) return map.get(start);
// iterate
for (int i = start + 1; i <= len; i++) {
if (isPalindrome(s.substring(start, i))) {
List<List<String>> child = dfs(s, i, map);
for (List<String> list : child) {
List<String> tmp = new ArrayList<String>();
tmp.add(s.substring(start, i));
tmp.addAll(list);
res.add(tmp);
}
// res.addAll(child);
}
}
map.put(start, res);
return res;
}
private boolean isPalindrome(String s) {
int l = 0, r = s.length() - 1;
while (l < r) {
if (s.charAt(l) != s.charAt(r)) {
return false;
}
l++;
r--;
}
return true;
}
}
/*
backtracking
memorization + DFS: 1) not visited, 2) visited + result, 3) visited no result
*/