You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用JavaScript获取字符串的幂集?求递归实现思路

实现字符串的幂集(去重且子集有序)

嘿,我明白你卡在递归实现幂集的逻辑上了,尤其是还要处理子集去重和有序的要求。别担心,我们一步步拆解这个问题,用回溯+递归的方式搞定它。

首先,先明确核心需求:

  • 幂集要包含所有子集(包括空集)
  • 每个子集的字符必须是有序的(比如不能出现'ba',只能是'ab')
  • 相同字符组成的子集无论顺序如何都算重复,只保留一次

核心思路拆解

要满足这些要求,我们可以分两步走:

  1. 预处理输入字符串:先把字符串排序,这样相同字符会挨在一起,而且生成的子集天然是有序的(不会出现逆序的组合)。
  2. 递归+回溯生成子集:递归的核心是「选或不选当前字符」,但要跳过重复的字符,避免生成重复子集。

代码实现(以JavaScript为例)

function getPowerSet(str) {
    // 第一步:排序字符串,确保相同字符连续,且子集天然有序
    const sortedChars = str.split('').sort();
    const result = [];

    // 递归回溯辅助函数
    const backtrack = (currentIndex, currentSubset) => {
        // 把当前构建好的子集加入结果(初始是空集,符合要求)
        result.push(currentSubset.join(''));

        // 从当前索引开始遍历,避免重复选择前面的字符
        for (let i = currentIndex; i < sortedChars.length; i++) {
            // 跳过重复字符:如果当前字符和前一个相同,且不是当前分支的第一个字符,直接跳过
            if (i > currentIndex && sortedChars[i] === sortedChars[i - 1]) {
                continue;
            }

            // 选择当前字符
            currentSubset.push(sortedChars[i]);
            // 递归处理下一个字符
            backtrack(i + 1, currentSubset);
            // 回溯:撤销选择,尝试不选当前字符的情况
            currentSubset.pop();
        }
    };

    // 启动递归,从索引0开始,初始子集为空数组
    backtrack(0, []);
    return result;
}

代码逻辑详解

  1. 字符串排序:比如输入'bac'会被转成['a','b','c'],这样后续生成的子集都是按字母顺序排列的,不会出现'ba'这种不符合要求的子集。
  2. 回溯函数的终止与推进:
    • 每次进入回溯函数,先把当前的子集加入结果(第一次加入的是空字符串,对应幂集的空集)。
    • 遍历从currentIndex开始的字符:
      • 跳过重复字符:如果当前字符和前一个相同,且不是当前分支的第一个字符(i > currentIndex),说明这个字符已经在之前的分支中处理过了,跳过它避免生成重复子集(比如输入'aab'时,第二个'a'会被跳过,不会重复生成'a'这个子集)。
      • 选择字符:把当前字符加入子集,递归处理下一个索引的字符。
      • 回溯撤销:递归返回后,把当前字符从子集里移除,继续处理不选这个字符的情况。

测试例子

  • 输入'ab',返回:["", "a", "ab", "b"]
  • 输入'aab',返回:["", "a", "aa", "aab", "ab", "b"]
  • 输入'bac',返回结果和'ab'的扩展一致:["", "a", "ab", "abc", "ac", "b", "bc", "c"]

这样就完美满足你的需求了——所有子集有序,没有重复,且包含空集。

内容的提问来源于stack exchange,提问作者user6398538

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:07:24