[LeetCode: 131. 分割回文串] | 刷题打卡

165 阅读2分钟

题目描述

给定一个字符串 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 月闯关活动」,点击查看活动详情