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

Posted

技术标签:

【中文标题】(排列?)通过逐个字符删除字符串【英文标题】:(Permutation?) of strings by removal of character by character 【发布时间】:2012-12-01 01:59:13 【问题描述】:

(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 产品(你们已经帮我解决了)所以这是我需要通过从规则,一个一个,依此类推,并输出每个排列。

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

谢谢你。

【问题讨论】:

【参考方案1】:

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

    遍历您的字符串并创建一个集合capitalIndexes,其中包含所有大写字母所在的索引。 对于capitalIndexes 的powerset 中的每一组s,打印除位于s 索引处的字符串之外的每个字符,然后打印\n

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

【讨论】:

C++!我不知道是否应该包含语言,我会在标签中这样做,然后阅读您的评论。 C++?节哀顺变!我添加了一个可能有用的答案链接。 实际上,我的程序中已经有一个部分可以生成我要摆脱的可空变量的幂集:) 啊,但我重读了你的东西,是的,生成 capitalindex 的幂集不是我所拥有的。我会在那里看看你的链接。你认为你可以给我一点 C++ 代码来开始第 2 步吗?我有一个 vector 索引,它现在包含所有可以为空的非终结符(这整件事基于语法,所以他们称它们为非终结符)(我正在构建 CNF,第一步是删除 lambda 产品和亚达亚达)。所以我需要生成比我的可为空变量的幂集? 对不起,我不是 C++ 的老兄。我希望其他答案就足够了。不过,powerset 问题很常见。如果其他答案没有帮助,我相信您可以通过一些谷歌搜索找到可复制粘贴的解决方案。【参考方案2】:

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

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

000 -> 一个

001 -> aC

010 -> 巴

011 -> BaC

等等

【讨论】:

@neojb1989 这可以称为位掩码。 我没有想到的 2^n,它会派上用场的。谢谢。【参考方案3】:

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

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

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

【讨论】:

好吧,我使用了排列这个词,因为我相信排列,顺序很重要,对吗?我不知道。但我更愿意保持顺序不变。 那么这是一个 void 函数吗? 是的,output temp 在输出中添加了一个项目,因此它可以返回 void。实际上,您可以用队列替换递归,然后它将按照您想要的顺序工作。 (这种递归算法就像使用堆栈。您可能希望队列保持正确的输出顺序。)还要注意真正的 permutations 永远不会删除任何项目。他们只是改变项目的顺序。 我很难为标题找到合适的词,所以我选择了我的大脑记得与顺序有关的排列,谢谢。我会看看这个。

以上是关于(排列?)通过逐个字符删除字符串的主要内容,如果未能解决你的问题,请参考以下文章

字符串数组的全排列——数组

我们如何通过重新排列字符串中的字符来获得最大数量的回文子串?

通过 websocket 或使用 WebRTC 的数据通道逐个字符发送?

C语言-删除字符串中指定的字符

含有重复字符的字符串排列组合

字符串处理算法删除特定的字符的算法设计及C代码实现