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;
    }
}