Scala Sub字符串与分隔符的组合

时间:2015-04-14 06:42:49

标签: scala

我的输入字符串是

element1-element2-element3-element4a|element4b-element5-element6a|element6b

所有元素(子字符串)由 - 分隔 - 对于某些元素,将有以|分隔的替代项(配管)。

有效的输出字符串包含仅由 - (破折号)分隔的元素和由|

分隔的任何一个替代元素

必须返回所有输出字符串的有效可能组合列表。

输出:

element1-element2-element3-element4a-element5-element6a
element1-element2-element3-element4b-element5-element6a
element1-element2-element3-element4a-element5-element6b
element1-element2-element3-element4b-element5-element6b

这可以使用while循环和字符串函数来完成,但它需要更多的复杂性。

(我是传统的Java程序员)

这是否可以使用Scala功能实现,从而提高效率

注意:输入可以包含任何元素和管道

1 个答案:

答案 0 :(得分:1)

这似乎符合法案。

def getCombinations(input: String) = {
  val group = """(\w|\|)+""".r         // Match groups of letters and pipes
  val word = """\w+""".r               // Match groups of letters in between pipes

  val groups = group.findAllIn(input).map(word.findAllIn(_).toVector).toList

  // Use fold to construct a 'tree' of vectors, appending each possible entry in a
  // pipe-separated group to each previous prefix. We're using vectors because 
  // the append time is O(1) rather than O(n).
  val tree = groups match {
    case (x :: tail) => {
      val head = x.map(Vector(_)) // split each element in the head into its own node
      tail.foldLeft(head) { (acc, elems) => 
        for (elem <- elems; xs <- acc) yield (xs :+ elem) 
      }
    }
    case _ => Nil // Handle the case of 0 inputs
  }

  tree.map(_.mkString("-")) // Combine each of our trees back into a dash-separated string
}

我还没有通过广泛的输入对此进行测试,但运行时的复杂性不应该太糟糕。介绍&#39;或&#39;由于问题的性质,管道导致输出增长。