使用Scala按顺序查找两个字符串的交集

时间:2014-09-15 21:05:38

标签: string list scala map fold

我试图用Scala查找两个字符串的交集。我对Scala很新,但我觉得这应该是一个单行。我尝试过使用map和foldLeft,但还没有得到正确答案。

给定两个字符串,返回按顺序相同的字符列表。例如," abcd"," acc"应该返回" a"和" abcd"," abc"应该返回" abc"。

以下是我迄今为止尝试过的两项功能

(str1 zip str2).map{ case(a, b) => if (a == b) a else ""}

(str1 zip str2).foldLeft(""){case(acc,n) => if (n._1 == n._2) acc+n._1.toString else ""}

我想做的是这样的事情

(str1 zip str2).map{ case(a, b) => if (a == b) a else break}

但这不起作用。

我知道我可以用多行和一个for循环来做到这一点,但这感觉就像一个单行。有人可以帮忙吗?

由于

4 个答案:

答案 0 :(得分:2)

(str1 zip str2).takeWhile( pair => pair._1 == pair._2).map( _._1).mkString

在scala REPL中测试它:

scala> val str1 = "abcd"
str1: String = abcd

scala> val str2 = "abc"
str2: String = abc

scala> (str1 zip str2).takeWhile( pair => pair._1 == pair._2).map( _._1).mkString
res26: String = abc

已编辑以传递两个测试用例

scala> (str1 zip "acc").takeWhile( pair => pair._1 == pair._2).map( _._1).mkString
res27: String = a

答案 1 :(得分:1)

这根本没有效率,但很明显:

 def lcp(str1:String, str2:String) = 
      (str1.inits.toSet intersect str2.inits.toSet).maxBy(_.length)
 lcp("abce", "abcd")                              //> res0: String = abc
 lcp("abcd", "bcd")                               //> res1: String = ""

(取字符串1的所有前缀与字符串2的所有前缀的交集中最长的一个)

答案 2 :(得分:0)

或者,为了避免压缩整个字符串:

(s1, s2).zipped.takeWhile(Function.tupled(_ == _)).unzip._1.mkString

答案 3 :(得分:0)

这是:

scala> val (s1, s2) = ("abcd", "bcd")
s1: String = abcd
s2: String = bcd

scala> Iterator.iterate(s1)(_.init).find(s2.startsWith).get
res1: String = ""

scala> val (s1, s2) = ("abcd", "abc")
s1: String = abcd
s2: String = abc

scala> Iterator.iterate(s1)(_.init).find(s2.startsWith).get
res2: String = abc