分割回文串

给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。

返回 s 所有可能的分割方案。

示例:

输入: “aab”
输出:

[
  ["aa","b"],
  ["a","a","b"]
]

搜索问题主要使用回溯法。

回溯法思考的步骤:

1、画递归树;

2、根据自己画的递归树编码。
在这里插入图片描述
代码参考:

public List<List<String>> partition(String s) {
        if(s.length() == 0)return res;
        Deque<String> path = new LinkedList<>();
        backTracking(s, 0, path);
        return res;
    }

    public  void backTracking(String s, int current, Deque<String> path){
        if(current == s.length()){
            res.add(new ArrayList<>(path));
        }
        for(int i=current;i<s.length();i++){
            String sub = s.substring(current, i+1);
            //非回文,舍弃
            if(!isPalindrome(sub))continue;

            path.addLast(sub);
            backTracking(s, i+1, path);
            path.removeLast();
        }
    }

    public  boolean isPalindrome(String s) {
        if(s.length() < 2)return true;
        int current = s.length()-1;
        for(int i=0;i<s.length()&&current>=0;i++){
            char rt = Character.toLowerCase(s.charAt(current));
            char lf = Character.toLowerCase(s.charAt(i));
            if((rt<'a' || rt > 'z') && (rt<'0' || rt >'9')){
                current--;
                i--;
                continue;
            }
            if((lf<'a' || lf > 'z') && (lf<'0' || lf >'9'))continue;

            if(rt != lf)return false;
            current--;
        }
        return true;
    }
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页