分割回文串(力扣第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; }