题目
131. 分割回文串【中等】
题解
-
如何判断字符串是回文串?
使用动态规划:f[i][j]代表s[i…j]是否是回文串,则有状态转移方程如下,
-
有了f[i][j],如何分割回文串?
利用回溯搜索,当s[0…i-1]是回文串,看s[i…j]是否是回文串,如果是,则加入ans中,以j+1作为新的i进行下一轮搜索
class Solution {
int n;
boolean[][] f;
List<String>ans=new ArrayList<>();
List<List<String>>res=new ArrayList<>();
public List<List<String>> partition(String s) {
n=s.length();
f=new boolean[n][n];
for(int i=0;i<n;i++)
Arrays.fill(f[i],true);
//动态规划
for(int i=n-1;i>=0;i--){
for(int j=i+1;j<n;j++){
f[i][j]=(s.charAt(i)==s.charAt(j))&&f[i+1][j-1];
}
}
dfs(s,0);
return res;
}
//回溯搜索
public void dfs(String s,int i){
if(i==n){
res.add(new ArrayList<>(ans));
return;
}
for(int j=i;j<n;j++){
if(f[i][j]){
ans.add(s.substring(i,j+1));
dfs(s,j+1);
ans.remove(ans.size()-1);
}
}
}
}
时间复杂度: O ( n ∗ 2 n ) O(n*2^n) O(n∗2n),长度为n的字符串划分方案数为 2 n − 1 2^{n-1} 2n−1,每一种划分方法需要 O(n) 的时间求出对应的划分结果并放入答案。
空间复杂度: O ( n 2 ) O(n^2) O(n2)