当前位置:首页 > JavaScript

力扣131 js实现

2026-03-01 16:01:27JavaScript

力扣131题(分割回文串)的JavaScript实现

题目描述
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。返回所有可能的分割方案。

示例
输入:"aab"
输出:

[
  ["a","a","b"],
  ["aa","b"]
]

解题思路

回溯法结合动态规划预处理回文串。

  1. 动态规划预处理:生成一个二维数组 dpdp[i][j] 表示 s[i...j] 是否为回文串。
  2. 回溯搜索:从字符串起始位置开始,利用预处理结果快速判断可分割点,递归生成所有合法分割方案。

JavaScript代码实现

/
 * @param {string} s
 * @return {string[][]}
 */
var partition = function(s) {
    const n = s.length;
    const dp = Array.from({ length: n }, () => new Array(n).fill(true));
    // 动态规划预处理回文串
    for (let i = n - 1; i >= 0; i--) {
        for (let j = i + 1; j < n; j++) {
            dp[i][j] = s[i] === s[j] && dp[i + 1][j - 1];
        }
    }

    const res = [];
    const backtrack = (start, path) => {
        if (start === n) {
            res.push([...path]);
            return;
        }
        for (let end = start; end < n; end++) {
            if (dp[start][end]) {
                path.push(s.slice(start, end + 1));
                backtrack(end + 1, path);
                path.pop();
            }
        }
    };
    backtrack(0, []);
    return res;
};

代码解释

  1. 动态规划预处理

    • 初始化 dp 数组,dp[i][j] 表示子串 s[i...j] 是否为回文。
    • 从后向前遍历,利用状态转移方程 dp[i][j] = s[i] === s[j] && dp[i+1][j-1] 填充 dp
  2. 回溯搜索

    • 从起始位置 start 开始,枚举所有可能的结束位置 end
    • s[start...end] 是回文(通过 dp[start][end] 判断),将其加入当前路径 path,并递归处理剩余子串 s[end+1...]
    • 回溯时弹出 path 末尾元素,继续尝试其他分割点。
  3. 终止条件

    力扣131 js实现

    • start 达到字符串末尾时,将当前路径 path 加入结果集 res

复杂度分析

  • 时间复杂度:O(n·2ⁿ),其中 n 为字符串长度。最坏情况下所有子串均为回文,共有 2ⁿ 种分割方案。
  • 空间复杂度:O(n²),存储 dp 数组所需空间。

标签: 力扣js
分享给朋友:

相关文章

vue.js实现轮播

vue.js实现轮播

Vue.js 实现轮播功能 使用第三方库(推荐) Vue.js 生态中有许多成熟的轮播组件库,例如 vue-awesome-swiper 或 swiper,它们功能丰富且易于集成。 安装 swipe…

js实现防洪

js实现防洪

防抖(Debounce)实现 防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口调整等场景。 function debounce(f…

实现继承js

实现继承js

实现继承的方式 在JavaScript中,实现继承可以通过多种方式完成,每种方式都有其优缺点。以下是几种常见的实现继承的方法: 原型链继承 原型链继承是最基本的继承方式,通过将子类的原型指向父类的实…

js实现 拖动

js实现 拖动

实现拖动的步骤 HTML 结构 创建一个可拖动的元素和一个放置区域: <div id="draggable" draggable="true">拖动我</div> <d…

js 实现文件上传

js 实现文件上传

文件上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现文件上传功能。以下是一个基础示例: <input ty…

js实现隐藏div

js实现隐藏div

隐藏div的几种方法 使用JavaScript隐藏div元素可以通过多种方式实现,以下是几种常见的方法: 方法一:修改style.display属性 将div的display属性设置为"none"…