分割回文串
题目链接:力扣题目链接
难度:中等
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。
回文串 是正着读和反着读都一样的字符串。
示例 1:
输入:s = “aab”
输出:[[“a”,“a”,“b”],[“aa”,“b”]]
思路
此题涉及到两个关键问题:
1.切割问题,有不同的切割方式
2.判断回文
切割问题类似组合问题:
例如abcdef:
- 组合问题:选取一个a之后,在bcdef中再去选取第二个,选取b之后在cdef中再选取第三个…
- 切割问题:切割一个a之后,在bcdef中再去切割第二段,切割b之后再cdef中再切割第三段…
回溯代码
class Solution{
List<List<String>> result = new ArrayList<>();
List<String> path = new ArrayList<>();
public List<List<String>> partition(String s) {
partition(s,0);
return result;
}
private void partition(String s,int start){
//如果起始位置大于s的大小,就找到了一组切割方案
if(start >= s.length()){
result.add(new ArrayList<>(path));
return;
}
for(int i=start;i<s.length();i++){
//如果是回文串就记录
if(isPalindrome(s,start,i)){
String str = s.substring(start,i+1);
path.add(str);
}else{
continue;
}
//起始位置后移,保证不重复
partition(s,i+1);
path.remove(path.size() - 1);
}
}
//判断是否回文
private boolean isPalindrome(String s,int start,int end){
for(int i=start,j=end;i<j;i++,j--){
if(s.charAt(i) != s.charAt(j)){
return false;
}
}
return true;
}
}