代码之家  ›  专栏  ›  技术社区  ›  user3407267

如何将一个字符串与另一个字符串之间有空格的字符串进行比较

  •  4
  • user3407267  · 技术社区  · 5 年前

    如何比较这两个字符串:

    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"
    

    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
    }
    

    这适用于最后一种情况,但不适用于其他情况。

    4 回复  |  直到 5 年前
        1
  •  1
  •   Leo C    5 年前

    sliding(i) ,其中 i 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
    
        2
  •  0
  •   Brian    5 年前

    这是一种使用 for/yield 这与@leo-c方法类似。A 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
  •  0
  •   Tim    5 年前

    def matchPattern(a: String, b: String): Boolean =
      a
        .split("\\s+")
        .tails
        .flatMap(_.inits)
        .exists(_.mkString("") == b)
    

    这将检查中的任何单词或单词序列 a 完全符合 b b

    这个 split

    这个 tails 调用返回列表的所有可能的尾随子序列,并且 inits

    exist call将单词连接在一起,并将它们与测试单词进行比较。


    请注意 尾巴 初始化 sliding 在检查任何可能的组合之前。

        4
  •  -1
  •   Dima    5 年前

      @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
       }