题目描述
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回 s 所有可能的分割方案。
示例:
输入: "aab"
输出:
[ ["aa","b"],
["a","a","b"]
]
题目解析
首先题目描述的不是特别清楚,我来给大家简单翻译翻译。题目中所说的子串,是字符串中连续的某一串,也就是用substr函数随意取的一段。然后要求我们把整个字符串拆成k个子串,k的取值是>=1的。然后每个子串要满足都是回文串。
算法思路
从题目的性质出发,我们最直接的想法就是从前往后找,不管三七二十一,找到第一个回文子串再说,找到第一个后再找第二个,第三个... 如果当前这个方案可以把整个字符串都用完的话,那就是一个合法方案。但是代码怎么实现呢?
我们抽象一下上面的模型,这个模型其实是获取子集的模型。给出一些位置 _ _ _ 然后在上面填上满足要求的值。所以可以用经典的递归回溯写法。而这里的满足要求就是子串是回文的
AC代码
/**
* @param {string} s
* @return {string[][]}
*/
var partition = function(s) {
const n = s.length;
const ans = [], path = [];
dfs(0);
return ans;
function dfs(u) {
if(u == n) ans.push([...path]);
for(let i = u; i < n; ++ i) {
let item = s.substr(u, i - u + 1);
if(check(item)) {
path.push(item);
dfs(i + 1);
path.pop();
}
}
}
function check(str) {
let l = 0, r = str.length - 1;
while(l < r) {
if(str[l] !== str[r])
return false;
l ++, r --;
}
return true;
}
};
本文正在参与「掘金 3 月闯关活动」,点击查看活动详情