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到i
deque.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;
}
}