【发布时间】:2011-11-14 19:25:56
【问题描述】:
假设,我有一个由N 符号组成的字母表,并且想在这个字母表上枚举所有长度为M 的不同字符串。 Scala 是否为此提供任何标准库函数?
【问题讨论】:
标签: scala combinatorics
假设,我有一个由N 符号组成的字母表,并且想在这个字母表上枚举所有长度为M 的不同字符串。 Scala 是否为此提供任何标准库函数?
【问题讨论】:
标签: scala combinatorics
从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)
}
需要额外的类型注释有点烦人,但没有它就行不通(除非有人知道另一种方法)。
【讨论】:
n的辅助列表吗?
fill,正如 4e6 所建议的那样。我将编辑我的答案以反映这一点。
另一种解决方案:
val alph = List("a", "b", "c")
val n = 3
alph.flatMap(List.fill(alph.size)(_))
.combinations(n)
.flatMap(_.permutations).toList
更新:如果你想在输出中得到一个字符串列表,那么alph应该是一个字符串。
val alph = "abcd"
【讨论】:
n 大于alph 的大小时,这似乎不起作用。例如:alph = List(0, 1)、n = 3 只产生 6 个序列,而不是预期的 8。