- 分割回文串
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回 s 所有可能的分割方案。
示例:
输入: “aab”
输出:
[
[“aa”,“b”],
[“a”,“a”,“b”]
]
1.回溯法的应用
class Solution {
public List<List<String>> partition(String s) {
int len = s.length();
List<List<String>> res = new ArrayList<>();
if(len == 0) return res;
dfs(s, 0, len, new ArrayList<String> (), res);
return res;
}
void dfs(String s, int index, int len, ArrayList<String> list, List<List<String>> res){
if(index == len){
res.add(new ArrayList<>(list));
return;
}
for(int i = index; i < len; i++){
if(!judge(s, index, i)){
//判断是否为回文
continue;//不是就直接剪枝
}
list.add(s.substring(index, i + 1));
dfs(s, index + 1, len, list, res);
list.remove(list.size() - 1);
}
}
boolean judge(String s, int begin, int end){
while(begin < end){
if(s.charAt(begin) != s.charAt(end)) return false;
begin++;
end--;
}
return true;
}
}
2.可以结合dp判断是否回文
class Solution {
public List<List<String>> partition(String s) {
int len = s.length();
List<List<String>> res = new ArrayList<>();
if(len == 0) return res;
boolean[][] dp = new boolean[len][len];
for(int right = 0; right < len; right++){
for(int left = 0; left <= right; left++){
if(s.charAt(left) == s.charAt(right) && (right - left <= 2 || dp[left + 1][right - 1])){
dp[left][right] = true;
}
}
}
//下面再增加一个参数
dfs(s, 0, len, dp, new ArrayList<String> (), res);
return res;
}
void dfs(String s, int index, int len, boolean[][] dp, ArrayList<String> list, List<List<String>> res){
if(index == len){
res.add(new ArrayList<>(list));
return;
}
for(int i = index; i < len; i++){
if(!dp[index][i]){
//判断是否为回文
continue;//不是就直接剪枝
}
list.add(s.substring(index, i + 1));
dfs(s, i + 1, len, dp, list, res);
list.remove(list.size() - 1);
}
}
boolean judge(String s, int begin, int end){
while(begin < end){
if(s.charAt(begin) != s.charAt(end)) return false;
begin++;
end--;
}
return true;
}
}