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

(Permutation?) of strings by removal of character by character

本文关键字:字符 删除 字符串 排列      更新时间:2023-10-16

(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|

这里不是在寻找效率,也不是在寻找过于出色的算法。一些简单而长或短而愚蠢的事情我也非常满意。

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

但是,你们可以忽略这一点。把它想象成一根绳子。因此,我们非常感谢您的帮助。

谢谢。

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

  1. 遍历字符串,创建一个包含所有大写字母的标记的集合capitalIndexes
  2. 对于capitalIndexes的幂集中的每个集合s,打印出字符串中除位于s中索引处的字符外的每个字符,然后打印n

这里唯一复杂的部分是生成功率集;这里有另一个答案,它提供了在C++中实现这一点的方法。

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

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

000->

001->aC

010->Ba

011->BaC

等等。

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

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)开始。

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