(字符排除?)通过字符删除字符串

时间:2012-12-01 01:59:13

标签: c++ algorithm vector char permutation

(C ++!我不知道是否应该提及) (如果可能,请保留订单!)

说我有,而且我做了,字符串ABaC。

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

的向量中

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

我想做的是对一个程序输出该字符串的每个排列,这是通过删除0个大写字母,然后是1个大写字母,然后是两个大写字母,然后是3个。

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

所以它会输出:

ABaC酒店| BAC | AAC |阿坝| AC | AA |的Ba |一个

不在这里寻找效率或在算法上太过辉煌。简单,长或短,愚蠢的东西我也很满意。

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

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

非常感谢你。

3 个答案:

答案 0 :(得分:2)

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

  1. 浏览你的字符串,并在所有存在大写字母的指标中创建一个capitalIndexes集。
  2. 对于s的{​​{3}}中的每个集capitalIndexes,打印出字符串的每个字符,但位于s的索引处的字符除外,然后打印{ {1}}。
  3. 这里唯一复杂的一点是生成powerset; powerset是另一个答案,它提供了一种在C ++中执行此操作的方法。

答案 1 :(得分:2)

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

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

000 - >一个

001 - >的aC

010 - >的Ba

011 - > BAC

答案 2 :(得分: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)启动它。

请注意,它可能以其他顺序提供结果。 (在您的问题中不确定订单对您来说有多重要。)