61.分割回文串
给你一个字符串 s,请你将 s 分割成一些 子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。
示例1:
输入:s = "aab"
输出:[["a","a","b"],["aa","b"]]
示例2:
输入:s = "a"
输出:[["a"]]
提示:
- 1 <= s.length <= 16
- s 仅由小写英文字母组成
代码:
class Solution {
public List<List<String>> partition(String s) {
//res用于存储所有分割方案
List<List<String>> res = new ArrayList<>();
//从索引0开始深度优先搜索
dfs(s,0,new ArrayList<>(),res);
//返回res
return res;
}
//s为原始字符串,start为当前处理的起始索引,path为已分割的回文子串列表,res为结果集
public void dfs(String s,int start,List<String>path,List<List<String>>res){
//终止条件:已处理完整个字符串
if(start == s.length()){
//添加当前分割方案到结果集
res.add(new ArrayList<>(path));
//直接返回
return;
}
//尝试所有可能的分割点
for(int end = start+1;end<=s.length();end++){
//截取子串
String subString = s.substring(start,end);
// 判断是否为回文
if(judge(subString)){
//选择当前回文子串
path.add(subString);
//递归处理剩余字符串
dfs(s,end,path,res);
//回溯:移除最后添加的子串
path.removeLast();
}
}
}
//判断字符串是否为回文
public boolean judge(String s){
for(int i = 0,j = s.length()-1;i<j;i++,j--){
//发现不对称字符,直接返回false
if(s.charAt(i)!=s.charAt(j))return false;
}
//否则返回true
return true;
}
}

浙公网安备 33010602011771号