标准函数,用于枚举给定字母表中给定长度的所有字符串

时间:2011-11-14 19:25:56

标签: scala combinatorics

假设我有一个N符号的字母表,并希望在此字母表中枚举长度为M的所有不同字符串。 Scala是否为此提供了任何标准库函数?

2 个答案:

答案 0 :(得分:3)

another answer获取灵感:

val letters = Seq("a", "b", "c")
val n = 3

Iterable.fill(n)(letters) reduceLeft { (a, b) =>
    for(a<-a;b<-b) yield a+b
}

Seq[java.lang.String] = List(aaa, aab, aac, aba, abb, abc, aca, acb, acc, baa, bab, bac, bba, bbb, bbc, bca, bcb, bcc, caa, cab, cac, cba, cbb, cbc, cca, ccb, ccc)

使用字符串以外的其他内容:

val letters = Seq(1, 2, 3)

Iterable.fill(n)(letters).foldLeft(List(List[Int]())) { (a, b) =>
    for (a<-a;b<-b) yield(b::a)
}

对额外类型注释的需求有点烦人但没有它就行不通(除非有人知道另一种方式)。

答案 1 :(得分:2)

另一种解决方案:

val alph = List("a", "b", "c")
val n = 3

alph.flatMap(List.fill(alph.size)(_))
    .combinations(n)
    .flatMap(_.permutations).toList

更新:如果您想在输出中获取字符串列表,那么alph应为字符串。

val alph = "abcd"