给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回 s 所有可能的分割方案。
示例:
输入: “aab”
输出:
[
[“aa”,“b”],
[“a”,“a”,“b”]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-partitioning
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
方法:递归回溯
思路:不断的寻找字符串的可切割点,然后拿到所有组合的可能;
步骤:
1,递归 遍历字符串,寻找回文子串,找到一个回文子串后,从该位置开始,继续寻找下一个回文子串,直到遍历完成;
2,每次都要对子串进行判断是否为回文子串,是的话就加入列表,遍历完成时,该列表存放的就是一组划分结果;
3,回溯时,就是在回文子串此处不切割的基础上,查找下一个回文子串,并且列表中删除该上次存放的回文子串,完成遍历又是一组解;
4,再递归回溯完成之后,所有的解都找到,存放到结果集合中即可;
class Solution {
List<List<String>> res = new ArrayList<>();
public List<List<String>> partition(String s) {
dfs(s,new ArrayList<>(),0);
return res;
}
//递归遍历整个字符串,寻找切割点
private void dfs(String s, List<String> temp, int index) {
//index等于length时结束
if (s.length() == index) {
res.add(new ArrayList<>(temp));
return;
}
//否则就开始遍历当前字符串,寻找回文子串,做切割点
for (int i = index + 1; i <= s.length(); i ++) {
//拿到当前子串判断是否回文
String tmp = s.substring(index,i);
//是回文子串就添加
if (isPlalindrome(tmp)) {
temp.add(tmp);
//从当前位置继续寻找下一个切割点
dfs(s,temp,i);
//回溯时删除
temp.remove(temp.size()-1);
}
}
}
//判断字符串是否是回文字符串
private boolean isPlalindrome(String s) {
int i = 0;
int j = s.length()-1;
//判断首尾相等
while (i < j) {
if (s.charAt(i) != (s.charAt(j)))
return false;
i ++;
j --;
}
return true;
}
}