我的输入字符串是
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功能实现,从而提高效率
注意:输入可以包含任何元素和管道
答案 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;由于问题的性质,管道导致输出增长。