生成字符串所有组合的算法

2022-09-02 05:08:06

我在网上找到了一个链接,显示了生成字符串所有组合的算法:http://www.mytechinterviews.com/combinations-of-a-string

算法复制如下。

void combine(String instr, StringBuffer outstr, int index)
{
    for (int i = index; i < instr.length(); i++)
    {
        outstr.append(instr.charAt(i));
        System.out.println(outstr);
        combine(instr, outstr, i + 1);
        outstr.deleteCharAt(outstr.length() - 1);
    }
} 

combine("abc", new StringBuffer(), 0);

我不明白的是这句话:

outstr.deleteCharAt(outstr.length() - 1);

如果我删除此行,程序显然不再起作用,但是为什么首先需要它?我理解递归的想法,即我们改变一个初始字符并递归其余字符,但是deleteChar行似乎不适合逻辑上的任何地方。添加 outstr.deleteCharAt 行的原因是什么?


答案 1

计算字符串可能组合的最简单方法在这里...

在数学上查找给定批次 N = NcR 中的 R 组合

因此,我们在这里发现的是,所有可能的组合 = Nc0 + Nc1 .... + Ncn = 2 Pow N

因此,对于长度为N个字符的给定单词,您将获得2个Pow N组合。

如果您以二进制表示1到(2 Pow N)整数,并将您的字符放在存在1的位置,最后您将获得解决方案。

例:

输入 : ABC

溶液:

ABC 长度为 3。所以可能的组合 2 Pow 3 = 8

如果 0 - 8 以二进制表示

000 =

001 = C

010 = B

011 = 公元前

100 = A

101 = 交流电

110 = AB

111 = ABC

所有可能的组合如上所示。


答案 2

调用 通过删除 的最后一个字符来计数器的效果。outstr.deleteCharAtoutstr.appendoutstr

每个循环迭代按如下方式进行:

  1. 追加字符
  2. 打印结果
  3. 在级别执行递归调用i+1
  4. 删除我们在步骤 1 中添加的字符