【问题标题】:Standard function to enumerate all strings of given length over given alphabet枚举给定字母表上给定长度的所有字符串的标准函数
【发布时间】:2011-11-14 19:25:56
【问题描述】:

假设,我有一个由N 符号组成的字母表,并且想在这个字母表上枚举所有长度为M 的不同字符串。 Scala 是否为此提供任何标准库函数?

【问题讨论】:

    标签: scala combinatorics


    【解决方案1】:

    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的辅助列表吗?
    • @Michael 是的,使用 fill,正如 4e6 所建议的那样。我将编辑我的答案以反映这一点。
    • 太棒了!感谢新版本。
    • @Owen -- 有没有办法让它适用于一般序列(不仅仅是字符串)?
    • @dsg 是的,虽然有点尴尬
    【解决方案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"
    

    【讨论】:

    • n 大于alph 的大小时,这似乎不起作用。例如:alph = List(0, 1)n = 3 只产生 6 个序列,而不是预期的 8
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    相关资源
    最近更新 更多