(排列?)通过逐个字符删除字符串
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这里有三个大写字母和 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 永远不会删除任何项目。他们只是改变项目的顺序。
我很难为标题找到合适的词,所以我选择了我的大脑记得与顺序有关的排列,谢谢。我会看看这个。以上是关于(排列?)通过逐个字符删除字符串的主要内容,如果未能解决你的问题,请参考以下文章
我们如何通过重新排列字符串中的字符来获得最大数量的回文子串?