分割回文串(力扣第131题)

题目:

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

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

示例:

输入: "aab"
输出:
[
  ["aa","b"],
  ["a","a","b"]
]

分析:

  先分析重要的点,第一求的的子串,子串!子串就要求必须是连续的一串字符序列,同时要求每个子串都是回文串,所以需要有一个判断字符串是否是回文串的功能,这个可以单独写成一个函数。那么应该怎么分割出所有的回文串呢?

  首先最坏的情况是,对于一个字符串,其含有的回文子串的长度都是1,也就是将这个字符串分割成一个个由单个字符组成的字符串,它们都是回文串。

  由于子串都是连续的,并且最小的回文串是由单个字符组成的字符串,那我们就从单个字符开始,先切分1个字符,判断是否是回文串,然后如果是,就将切分之后剩下的子串拿去继续递归搜索判断,一直到整个字符串切分完即可。如果最后字符串长度为0,那么就说明整个组合都是回文子串,就将这个组合添加到结果列表中,然后回溯到上一层,开启新一轮的切分,增加原先的切分长度,继续搜索。如果切分的不是回文串,那么就跳过此次切分,继续循环开启新的切分,直到循环结束,还不是回文串的话,那就回溯,更换上一层的切分子串。

实现的代码如下:

  

 private List<List<String>> reslist;

    public List<List<String>> partition(String s) {

        if (s == null || s.length() == 0){
            return new ArrayList<>();
        }

        reslist = new ArrayList<>();
        List<String> curlist = new ArrayList<>();

        findsubStr(s,curlist);

        return reslist;
    }

    private void findsubStr(String s, List<String> curlist) {

        if (s.length() == 0){
            reslist.add(new ArrayList<>(curlist));
            return;
        }


        for (int j = 0; j < s.length(); j++) {

            if (isPalindrome(s,0,j)){
                curlist.add(s.substring(0,j+1));
                findsubStr(s.substring(j+1),curlist);
                curlist.remove(curlist.size()-1);
            }
        }

    }

    private boolean isPalindrome(String s, int i, int j) {

        while (i < j){
            if (s.charAt(i++) != s.charAt(j--)){
                return false;
            }
        }
        return true;
    }

 

  

posted @ 2020-07-22 22:11  有心有梦  阅读(233)  评论(0编辑  收藏  举报