分割回文串
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是
回文串 。返回 s 所有可能的分割方案
示例 1:
输入: s = “aab”
输出:[[“a”,“a”,“b”],[“aa”,“b”]]
解题思路
- 1、使用回溯算法来生成所有可能的回文串分割方案。
- 2、对于每个位置,尝试从当前位置开始的所有子串,如果是回文串,则将其加入当前分割方案,并递归搜索下一个位置。
- 3、使用递归回溯的方法,搜索所有可能的分割方案。
Java实现
public class PalindromePartitioning {
public List<List<String>> partition(String s) {
List<List<String>> result = new ArrayList<>();
List<String> current = new ArrayList<>();
partitionHelper(s, 0, current, result);
return result;
}
private void partitionHelper(String s, int start, List<String> current, List<List<String>> result) {
if (start == s.length()) {
result.add(new ArrayList<>(current));
return;
}
for (int end = start + 1; end <= s.length(); end++) {
String substring = s.substring(start, end);
if (isPalindrome(substring)) {
current.add(substring);
partitionHelper(s, end, current, result);
current.remove(current.size() - 1);
}
}
}
//判断是否是回文串
private boolean isPalindrome(String s) {
int left = 0, right = s.length() - 1;
while (left < right) {
if (s.charAt(left++) != s.charAt(right--)) {
return false;
}
}
return true;
}
public static void main(String[] args) {
PalindromePartitioning solution = new PalindromePartitioning();
String s = "aabbc";
List<List<String>> partitions = solution.partition(s);
for (List<String> partition : partitions) {
System.out.println(partition);
}
}
}
时间空间复杂度
时间复杂度:O(N * 2^N), 其中N为字符串s的长度。因为对于每个位置,最坏情况下需要尝试2^N种分割方案,每种分割方案都需要判断每个子串是否是回文串。
空间复杂度:O(N^2),存储所有可能的分割方案。