繁体   English   中英

从给定字符串中查找长度为k的所有排列/组合

[英]Find all permutations/combinations of length k from given string

这是在接受采访时向我询问的。 给定一个字符串,我必须编写程序来查找长度为k的所有排列/组合。 所以对于string =“cra”和length = 2以下需要在向量中返回:“ca”,“cr”,“rc”,“ra”,“ac”,“ar”。 不允许重复。

有什么建议怎么办呢?

我想出的是使用重复。 基本上循环遍历所有字符并将其添加到序列中。 当长度与给定长度匹配时,它将附加到最终向量。

正如Slava所提到的,你可以使用std::next_permutation但我有一种感觉,面试官希望看到你的技术能力,以了解perms和comps的工作原理。

是一个有用的链接。 它使用Java / C# ,我看了它,看起来它可以很容易地转换为C ++。

该链接包含强大的评论,非常适合理解解决方案的内部工作原理。

我希望你能发现这对你的下一次采访很有用。 :)

我会寻找递归的东西,因为我喜欢递归。 “cra”中大小为k的子字符串是:

  • “c”,后跟“ra”中大小为k-1的子串
  • “r”,后跟大小为k-1的子串是“ca”
  • “a”,然后是“cr”中大小为k-1的子串

所以如果我写E组的n个字符,e_i它的元素。

  • 子串(E,k)= {“”}如果k = 0(是的,我也喜欢将重现初始化为0)
  • 和子串(E,k)= Union(子串(e_i +子串(E \\ e_i,k-1)))如果k> 0

这种东西在黑板上比在数字文本中更适合。 我们试试纯文字:

大小为k的集合E的子串是e_i上的第一个字母为e_i的子串的E的每个元素的并集。

我清楚了吗? 我不知道我是否清楚。

之后,如果存储中间结果,可以通过交换内存使用的计算时间来优化方法,这样您就不必多次计算它们(对于n = 3无关紧要,但它绝对重要当n变大时)。 如果您的起始单词是abcdefgh并且k = 5,那么您将存储子字符串(“cdefgh”,3)之类的内容,这样您就不必为以a开头的单词和以b开头的单词计算它。 你会节省大量的计算时间,但是当n变大时可能需要大量的内存。 如果你有一个内存阈值,最好存储最小k的子串,就像那些最需要请求的那些(递归树的结尾)。

最后一个问题:如何存储? 我选择使用该对的映射(“cdefgh”,3),甚至单独使用“cdefgh”作为键,将子串的集合作为值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM