题目链接
思路:动态规划+深搜
分析,字符串的长度最长是16,定义一个数组dp
dp[i][j]:表示从第i位开始到j位是否是一个回文,如果从0到i,i到j,。。。。。一直到最后,dp都是true,那么这就是一个答案。
第一步:预处理好dp
第二步:深搜dp记录方案。
代码:
class Solution {
public List<List<String>> partition(String s) {
int len = s.length();
//记录i到j是否是回文字符串
boolean[][] dp = new boolean[len][len];
//长度为1的肯定是回文
for(int i = 0 ; i < len;i++){
dp[i][i] = true;
}
//长度为2
for(int i = 1; i<len;i++){
if(s.charAt(i-1) == s.charAt(i)){
dp[i-1][i] = true;
}
}
//长度一直增长
for(int length = 3; length <= len;length++){
for(int i = 0;i+length-1 < len;i++){
//只有之前的是回文,并且加进来的一前一后两个相同,形成的字符串才能是回文
if(s.charAt(i)==s.charAt(i+length-1) && dp[i+1][i+length-2]){
dp[i][i+length-1] = true;
}
}
}
List<List<String>> res = new ArrayList<>();
List<String> path = new ArrayList<>();
//深搜dp数组
dfs(res,path,s,len,dp,0);
return res;
}
//pos 表示当前搜索的位置,当到达最后一个位置的时候,搜索完毕
public void dfs(List<List<String>> res, List<String> path, String s, int len,boolean[][] dp,int pos){
if(pos == len){
res.add(new ArrayList<>(path));
return;
}
for(int i = pos;i<len;i++){
//只有当前位置到i是回文,才能进行深搜
if(dp[pos][i]){
path.add(s.substring(pos,i+1));
dfs(res,path,s,len,dp,i+1);
path.remove(path.size()-1);
}
}
}
}
努力学习,安静等待。
不打扰是我的温柔。