1.题目:
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。
回文串 是正着读和反着读都一样的字符串。
示例 1:
输入:s = "aab" 输出:[["a","a","b"],["aa","b"]] 示例 2:
输入:s = "a" 输出:[["a"]]
来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/palindrome-partitioning 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2.代码:
class Solution {
List<List<String>> result = new ArrayList<>();
List<String> path = new ArrayList<>();
public List<List<String>> partition(String s) {
backtracking(s,0);
return result;
}
public void backtracking(String s,int startIndex){
if(startIndex>=s.length()){//当分割的索引到达了字符串的最后边的时候,证明分割完成了
result.add(new ArrayList<>(path));
return;
}
for(int i=startIndex; i<s.length(); i++){
if(isPalindrome(s,startIndex,i)){//判断了是回文串!!,注意传入的参数
String str = s.substring(startIndex,i+1);//注意切割的是前闭后开,所以是i+1
path.add(str);
}else{
continue;
}
backtracking(s,i+1);//递归
path.remove(path.size()-1);//回溯
}
}
public boolean isPalindrome(String s,int startIndex,int end){//判断是否是回文串
for(int i=startIndex, j=end;i<j; i++,j--){//直接两个指针来判断,i和j,注意j是--
if(s.charAt(i)!=s.charAt(j)){
return false;
}
}
return true;
}
}