如何递归地找到字符串序列的公共根?
How to find the common root of a sequence of strings recursively?
我希望能够读取字符串序列和 return 字符串的公共词干。例如,如果我有以下序列:
val testSeq: Seq[String] = Seq("RootA_", "RootB_", "RootC_")
那么只有字符串 "Root" 应该 returned。
我当前的函数看起来像这样,但是使用相交意味着不需要的“_
”被return编辑为根的一部分,即"Root_"。我尝试使用 takeWhile 但没有成功。
def findRoot(ss: Seq[String], root: String): String = ss match {
case h :: Nil => h.intersect(root)
case h :: t => findRoot(t, h.intersect(t.head))
}
如果有内置的 Scala 方法,请告诉我!否则,如果有人想解决这个问题,我们将不胜感激!
据我所知,没有返回两个字符串公共前缀的scala stdlib函数。
您可以使用 zip
和 takeWhile
计算公共前缀
def findRoot(seq: Seq[String]): String = {
def prefix(a: String, b: String) = a
.zip(b)
.takeWhile { case (a, b) => a == b }
.map(_._1)
.mkString
@tailrec
def find(ss: Seq[String], root: String): String = ss match {
case h :: Nil => prefix(h, root)
case h :: t => find(t, prefix(h, root))
}
find(seq.tail, seq.head)
}
我希望能够读取字符串序列和 return 字符串的公共词干。例如,如果我有以下序列:
val testSeq: Seq[String] = Seq("RootA_", "RootB_", "RootC_")
那么只有字符串 "Root" 应该 returned。
我当前的函数看起来像这样,但是使用相交意味着不需要的“_
”被return编辑为根的一部分,即"Root_"。我尝试使用 takeWhile 但没有成功。
def findRoot(ss: Seq[String], root: String): String = ss match {
case h :: Nil => h.intersect(root)
case h :: t => findRoot(t, h.intersect(t.head))
}
如果有内置的 Scala 方法,请告诉我!否则,如果有人想解决这个问题,我们将不胜感激!
据我所知,没有返回两个字符串公共前缀的scala stdlib函数。
您可以使用 zip
和 takeWhile
def findRoot(seq: Seq[String]): String = {
def prefix(a: String, b: String) = a
.zip(b)
.takeWhile { case (a, b) => a == b }
.map(_._1)
.mkString
@tailrec
def find(ss: Seq[String], root: String): String = ss match {
case h :: Nil => prefix(h, root)
case h :: t => find(t, prefix(h, root))
}
find(seq.tail, seq.head)
}