【问题标题】:Given a string return all permutations by removing characters and maintaining the order给定一个字符串,通过删除字符并保持顺序返回所有排列
【发布时间】:2021-08-10 20:33:00
【问题描述】:

我相信这主要是词汇问题,我希望在使用正确词汇的情况下我已经找到了答案。我有一个任意长度的字符串,我想返回这个字符串的所有“排列”,同时保持字符的顺序,排列的差异是通过删除字符来实现的。

传统上,字符串排列的答案是:给定字符串“ABC”,使用递归树返回 [“ABC”、“ACB”、“BAC”、“BCA”、“CBA”、“CAB”] 或任何数字或其他算法。

但是我想要:给定一个字符串 "ABC" 返回 ["A", "AB", "ABC", "AC", "B", "BC", "C"]

我认为我对排列一词的使用让我感到困惑。

找到可以实现这一目标的算法的正确术语是什么?或者有什么想法可以开始解决这个问题?

【问题讨论】:

  • 您正在寻找生成 Power Set - 集合的所有子集的集合。

标签: string permutation


【解决方案1】:
s='ABC'
p=['']
for i in s:
    p += [j+i for j in p]
del p[0]
print(p)

试试这个,逻辑很简单,是这样的(每次迭代后对象p都属于):

['']
['', 'A']
['', 'A', 'B', 'AB']
['', 'A', 'B', 'AB','C', 'AC', 'BC', 'ABC']

最后,索引为 0 的项目被删除,我们得到了所有可能排列的列表!

【讨论】:

    【解决方案2】:

    我试图按照与 JavaScript 中没有什么特别的东西相同的方法来解决它,并且一直在无限回避。我也尝试在 JS 中实现他们的代码,并尽我所能(我敢肯定这是因为我无法编码,而不是他的起始代码)。

    上面来自 RaffleBuffle 的评论对我来说是这样的:Power Sets 引导我查看返回 Set 的 Power Set 的算法。我选择了这个似乎也相当快的版本:

    const listSubSets = (string) => {
      const stringArray = string.split("");
      const getSubSets = (array) => array.reduce(
        (subsets, value) => subsets.concat(
          subsets.map(set => [...set, value])
        ),
        [[]]
      ).map(x => x.join(""));
    
      return getSubSets(stringArray);
    };
    

    【讨论】:

    • 对不起,我没有注意到你没有在任何地方提到该语言......我的错,我以为是python......但是你应该在你的问题和标签中添加一些代码语言...这会让您的问题受欢迎...
    • 绝对没问题,我相当有信心这是一个定义问题,如果我有神奇的词,我可以自己查一下。蟒蛇根本没有打扰我,我只是无法有效地翻译它。
    猜你喜欢
    • 2020-09-30
    • 1970-01-01
    • 2020-01-20
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    相关资源
    最近更新 更多