分割回文串
给你一个字符串 s
,请你将 s
分割成一些子串,使每个子串都是 回文串
。返回 s
所有可能的分割方案。
示例 1:
输入:
s = "aab"
输出:
[["a","a","b"],["aa","b"]]
示例 2:
输入:
s = "a"
输出:
[["a"]]
javascript
/**
* @param {string} s
* @return {string[][]}
*/
var partition = function(s) {
const res = []
const com = [] // 分割方案数组
const len = s.length
function dfs(start, end) {
if(end === len) { // 分割完所有字符了
res.push([...com])
return
}
// 连选
if(end < len - 1) {
dfs(start, end + 1)
}
// 不连选,判断当前子串是否是回文,是回文,则可以收集当前子串,并从下一个重新开始遍历
if(isPalindromic(s, start, end)) {
com.push(s.substring(start, end + 1)) // 收集当前子串
dfs(end+1, end+1) // 从下一个重新开始遍历
com.pop()
}
}
dfs(0, 0)
return res
};
// 字符串的子串是否是回文
function isPalindromic(str, left, right) {
while(left < right) {
if(str[left] !== str[right]) {
return false
}
left += 1;
right -=1;
}
return true
}
解题思路
- 使用深度遍历
dfs
- 分为
连选
和不连选