class Solution {
List<List<String>> list;
List<String> ans;
int n = 0;
boolean[][] dp;
public List<List<String>> partition(String s) {
list = new ArrayList<>();
ans = new ArrayList<>();
n = s.length();
dp = new boolean[n][n];
if(n == 0){
return list;
}
for(int i = 0;i < n;i++){
for(int j = 0;j < n;j++){
if(j == i){
dp[i][j] = true;
}
if(j - i == 1 && s.charAt(i) == s.charAt(j)){
dp[i][j] = true;
}
}
}
int a = 2;
while(a < n){
for(int i = 0;i + a < n;i++){
if(dp[i + 1][i + a - 1] && s.charAt(i) == s.charAt(i + a)){
dp[i][i + a] = true;}
}
a++;
}
dfs(s,0);
return list;
}
void dfs(String s,int index){
if(index >= n){
list.add(new ArrayList<String>(ans));
return;
}
for(int i = index;i < n;i++){
if