「LeetCode」131-分割回文串

166 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情

一.题目:

131. 分割回文串 给你一个字符串 s,请你将 **s **分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。

回文串 是正着读和反着读都一样的字符串。

示例 1:

输入: s = "aab"
输出: [["a","a","b"],["aa","b"]]

示例 2:

输入: s = "a"
输出: [["a"]]

提示:

  • 1 <= s.length <= 16
  • s 仅由小写英文字母组成

二、思路分析:

首先看到题目中的让我们返回所有可能的分割方案,分割方案成立的条件是每个数组都是回文串,这就表明着我们需要使用到的策略是利用回溯法进行所有情况的列举,遇到符合的则加入结果数组中。所以这道题目的基本步骤为:

  • 首先创建一个结果数组和一个路径数组,路径数组用来存储每次遍历的子串,用来判断是否符合题目的要求。
  • 创建一个判断是否为回文串的函数,回溯法的边界条件就是判断我们所取到的子串中是否符合回文串,不符合则跳过。
  • 如果我们遍历的i到达了整个字符串的位置,那么就将这个字符串推入结果数组中,注意不要忘记了需要对遍历的路径就行回溯的操作。

三、代码:

function partition(s: string): string[][] {
    let res:string[][] = [];
    let path:string[] = [];
    const n = s.length;
    const isCircle = (start, end) => {
        for(let l = start, r = end; l <= r ; l++,r--){
            if(s[l] !== s[r]) return false
        }
        return true;
    }
    const dfs = (i) => {
        if(n === i){
            res.push(Array.from(path));
            return;
        }
        for(let j = i ; j < n ; j++){
            if(!isCircle(i, j)){
                continue;
            }
            path.push(s.substr(i, j-i+1));
            dfs(j+1);
            path.pop();
        }
    }
    dfs(0);
    return res
};

四、总结:

这道题目我们必须要掌握的就是回溯法的基本框架,因为题目的介绍很简短,并且十分符合回溯法的格式,遇到符合的推入结果数组,反之继续进行遍历。