DFS non-DP solution.
public class Solution {
public List<List<String>> partition(String s) {
List<List<String>> ret = new ArrayList<>();
List<String> curr = new ArrayList<>();
dfs(0, s, curr, ret);
return ret;
}
private static void dfs(int pos, String s, List<String> curr, List<List<String>> ret) {
if (pos == s.length()) {
ret.add(new ArrayList<>(curr));
return;
}
for (int i=pos; i<s.length(); i++) {
String subStr = s.substring(pos, i+1);
if (isPalindrome(subStr)) {
curr.add(subStr);
dfs(i+1, s, curr, ret);
curr.remove(curr.size()-1);
}
}
}
private static boolean isPalindrome(String s) {
int i=0, j=s.length()-1;
while (i < j) {
if (s.charAt(i) != s.charAt(j)) {
return false;
}
i++;
j--;
}
return true;
}
}
Improvement (from 13ms to 7ms). Using a 2D array to save if substring(i, j+1) is a palindrom so that we don't need to check isPalindorme(substring(i, j+1)) every time we call DFS.
public class Solution {
public List<List<String>> partition(String s) {
boolean[][] dp = new boolean[s.length()][s.length()];
buildPalinTab(dp, s);
List<List<String>> ret = new ArrayList<>();
List<String> curr = new ArrayList<>();
dfs(0, s, curr, ret, dp);
return ret;
}
private static void dfs(int pos, String s, List<String> curr, List<List<String>> ret, boolean[][] dp) {
if (pos == s.length()) {
ret.add(new ArrayList<>(curr));
return;
}
for (int i=pos; i<s.length(); i++) {
if (dp[pos][i]) {
String subStr = s.substring(pos, i+1);
curr.add(subStr);
dfs(i+1, s, curr, ret, dp);
curr.remove(curr.size()-1);
}
}
}
private static void buildPalinTab(boolean[][] dp, String s) {
for (int i=s.length()-1; i>=0; i--) {
for (int j=i; j<s.length(); j++) {
if (s.charAt(i) == s.charAt(j)) {
if (j-i < 3) dp[i][j] = true;
else dp[i][j] = dp[i+1][j-1];
}
}
}
}
}