1

(C++!我不知道该不该提)(尽量保持顺序!)

假设我有,我有,字符串 ABaC。

我将该字符串中的每个字符都放在一个名为 temp 的向量中。

所以我有 temp[0] = A,temp[1] = B,temp[3] = a,temp[4] = C。

我想做的是正确的一个程序,它输出该字符串的每个排列,其结果是删除 0 个大写字母,然后是 1 个大写字母,然后是两个大写字母,然后是全部 3。

我删除大写字母的原因是......你不应该专注于大写字母。碰巧我需要删除这里的所有大写字母,但是,比如说 ADbd,我不需要删除 D。所以说真的,这是一种从字符串中删除一组已知字符的算法。

所以它会输出:

ABaC|BaC|AaC|ABa|aC|Aa|Ba|a

不是在这里寻找效率或算法太出色。简单而长或短而愚蠢的东西我也很满意。

这是我正在处理的一个正在进行的项目的一部分,该项目删除了 lambda 产品(你们已经帮我解决了)所以这是我需要通过从规则中删除可为空的变量来构建新的生产规则的步骤,一个一个,依此类推并输出每个排列。

但是,你们都可以忽略这一点。把它想象成字符串。因此,非常感谢任何帮助。

谢谢你。

4

3 回答 3

2

我不确定您使用的是哪种语言,因此我提供了以下高级步骤。

  1. 遍历您的字符串并创建一组capitalIndexes存在大写字母的所有索引。
  2. 对于spowerset中的每个集合capitalIndexes,打印出字符串的每个字符,除了位于 in 索引处的字符s,然后打印\n

这里唯一复杂的一点是生成 powerset。是另一个答案,它提供了一种在 C++ 中执行此操作的方法。

于 2012-12-01T02:12:56.643 回答
2

这里有三个大写字母和 8 个解决方案。那应该给您一个想法(2 ^ 3 = 8)。

如果您有 n 个大写字母,请遍历数字 0 -> 2^n - 1。对于每个数字,您使用其二进制表示来确定是否包含大写字母。

000 -> 一个

001 -> 交流

010 -> 巴

011 -> 巴碳

等等

于 2012-12-01T02:16:43.070 回答
1

您没有指定任何语言,所以我用伪语言编写它:

Function(string temp, int startindex):

output temp
for i = startindex to temp.length-1 {
  if temp[i] is capital {
    temp.remove(i)
    Function(temp.clone(), i)
  }
}

你从Function(temp, 0).

请注意,它可能以您想要的其他顺序给出结果。(从您的问题中不确定订单对您有多重要。)

于 2012-12-01T02:16:01.413 回答