如何比较这两个字符串:
val a = "fit bit versa"
val b = "fitbit"
另一个例子
val a = "go pro hero 6"
val b = "gopro"
另一个例子
val a = "hero go pro 6"
val b = "gopro"
另一个例子
val a = "hero 6 go pro"
val b = "gopro"
对于以上比较,我想获得“ true”,但在这里不是:
val a = "vegan protein powder"
val b = "vega"
这应该是错误的。
我目前正在做
def matchPattern(a:String, b: String):String=
{
val dd = a.split(" ")
val result = dd.map(_.toLowerCase())
if(result contains b.toLowerCase) true
else false
}
这适用于最后一种情况,但不适用于其他情况。
有什么建议吗?
答案 0 :(得分:1)
这是使用sliding(i)
的一种方法,其中i
的范围是2到a
中的单词数,以组合所有可能并置的相邻单词的列表。然后检查以查看b
是否与列表中的任何元素完全匹配,如下所示:
def matchPattern(a: String, b: String): Boolean = {
val words = a.toLowerCase.split("\\s+")
val concats = (2 to words.size).foldLeft(words)(
(acc, i) => acc ++ words.sliding(i).map(_.mkString)
)
concats contains b.toLowerCase
}
matchPattern("Hero go Pro 6", "gopro")
// res1: Boolean = true
matchPattern("Hero go Pro 6", "gopro6")
// res2: Boolean = true
matchPattern("Vegan protein powder", "vega")
// res3: Boolean = false
答案 1 :(得分:0)
我认为这是解决您问题的方法。
def matchPattern(a: String, b: String): Boolean =
a
.split("\\s+")
.tails
.flatMap(_.inits)
.exists(_.mkString("") == b)
这将检查a
中与b
中的单词完全匹配的任何单词或单词序列。它将拒绝将b
嵌入较长的单词或单词序列中的情况。
split
调用将字符串变成单词列表。
tails
调用返回列表的所有可能的尾随子序列,而inits
返回所有开头的子序列。将两者结合起来会生成原始列表的所有可能子序列。
exist
调用将单词连接在一起,并将它们与测试单词进行比较。
请注意,tails
和inits
是惰性的,因此它们将依次生成每个要测试的解决方案,并在找到解决方案后立即停止。这与使用sliding
的解决方案形成对比,该解决方案在检查任何组合之前都会创建每种可能的组合。
答案 2 :(得分:0)
这是使用for/yield
的方法,结果与@ leo-c方法类似。 for
用于从i
生成长度为words
的滑动窗口,以返回原始单词和组合。
def matchPattern(a:String, b: String): Boolean = {
val words = a.split(" ")
val combinations = words ++ (for(
i <- (2 to words.size);
acc <- words.sliding(i)
) yield acc).map(_.mkString)
combinations.contains(b)
}
测试用例:
val a = "fit bit versa"
val b = "fitbit"
val c = "go pro hero 6"
val d = "gopro"
val e = "hero go pro 6"
val f = "gopro"
//false
val g = "vegan protein powder"
val h = "vega"
val i = "foo gopro bar"
val j = "gopro"
val k = "foo go pro hero bar"
val l = "goprohero"
scala> matchPattern(a,b) && matchPattern(c,d) && matchPattern(e,f) && !matchPattern(g,h) && matchPattern(i,j) && matchPattern(k,l)
res175: Boolean = true
答案 3 :(得分:-1)
我猜是这样的(您的要求是不完整的,所以我将它们解释为“完全匹配给定字符串的开头部分,以空格或行尾结尾,也许除了空格)。
@tailrec
def matchWords(input: Seq[Char], words: Seq[Char]): Boolean = (input, words) match {
case (Seq(), Seq() | Seq(' ', _*)) => true
case (Seq(), _) => false
case (Seq(a, tail@_*), Seq(b, rest@_*)) if a == b => matchWords(tail, rest)
case (_, Seq(' ', rest@_*)) => matchWords(input, rest)
case _ => false
}