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

时间:2018-05-04 13:10:49

标签: c++ arrays string algorithm

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

有任何建议如何去做?

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

2 个答案:

答案 0 :(得分:1)

Slava所述,您可以使用std::next_permutation,但我感觉面试官希望看到您的技术能力,以了解perms和comps的工作方式。

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

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

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

答案 1 :(得分:1)

我会寻找递归的东西,因为我喜欢递归。 “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”作为键,将子串的集合作为值。