131.分割回文串
给你一个字符串 s
,请你将 s
分割成一些子串,使每个子串都是 回文串 。返回 s
所有可能的分割方案。
回文串 是正着读和反着读都一样的字符串。
示例 1:
输入:s = "aab" 输出:[["a","a","b"],["aa","b"]]
示例 2:
输入:s = "a" 输出:[["a"]]
class Solution {List<List<String>> lists = new ArrayList<>();Deque<String> deque = new LinkedList<>(); //创建双端队列,两端都可进可出public List<List<String>> partition(String s) {backTracking(s, 0);return lists;}private void backTracking(String s, int startIndex) { //传入字符串和分割的起始位置// 如果起始位置大于等于s的大小,说明找到了一组分割方,分割已到字符串末尾if (startIndex >= s.length()) {lists.add(new ArrayList(deque)); //将其分割结果记入链表中return;}for (int i = startIndex; i < s.length(); i++) { //startIndex是上一次分割完的位置,是固定的;i值则继续++// 如果是回文子串,则记录if (isPalindrome(s, startIndex, i)) {String str = s.substring(startIndex, i + 1); //结果值取到startIndex到ideque.addLast(str);} else {continue;}// 起始位置后移,保证不重复backTracking(s, i + 1);deque.removeLast();}}// 判断是否是回文串private boolean isPalindrome(String s, int startIndex, int end) {for (int i = startIndex, j = end; i < j; i++, j--) {if (s.charAt(i) != s.charAt(j)) {return false;}}return true;}
}