http://d.hatena.ne.jp/nowokay/20080717#1216294670
とりあえず、こんな感じかな(k文字版)。効率は度外視して、サクっと書ける書き方で書いてみた。
object S { def strings(list: List[String]): List[String] = { def g(prefix: String, list: List[String]): List[String] = { list match { case Nil => List(prefix) case _ => for(s <- list if (s indexOf prefix) == 0; r <- g(s substring 1, list - s)) yield s(0) + r } } g("", list) } }
実行結果。
scala> :load strings.scala Loading strings.scala... defined module S scala> import S._ import S._ scala> strings(List("ABA", "BAB", "ABC", "BCA", "CAB", "CAA", "AAB")) res0: List[String] = List(CABABCAAB, CABCAABAB, CAABABCAB, CAABCABAB)