斯卡拉懒惰 - 如何在这个回文搜索中摆脱回报声明?

时间:2013-03-06 17:06:45

标签: scala

上下文:在大量文本中找到最长的回文。

这里有两个解决方案 - 一个带有'return'(一直打破嵌套函数),还有一个糟糕的“纯粹”答案。我如何编写一个具有第一个性能的纯解决方案?

  def isPalindrome(str: String) : Boolean = str.reverse == str

  def longestPalindrome(haystack : String) : String = {
    (haystack.length to 1 by -1).foreach{ substrSize =>
      haystack.sliding(substrSize).foreach{ substr =>
        if(isPalindrome(substr))
          return substr
      }
    }
    ""
  }

  def longestPalindrome2(haystack : String) : String = {
    val x = for {
      substrSize <- haystack.length to 1 by -1
      substr <- haystack.sliding(substrSize)
    } yield (substr -> isPalindrome(substr))
    x.find(_._2 == true).map(_._1).getOrElse("")
  }

2 个答案:

答案 0 :(得分:3)

似乎您的问题是如何在不使用return的情况下“短路”计算。一种方法是创建view的非严格Range。这是一个例子,

def palindromeStream(haystack : String) = {
  for {
    substrSize <- (haystack.length to 1 by -1).view
    substr <- haystack.sliding(substrSize)
    if isPalindrome(substr)
  } yield substr
}

val x = palindromeStream("a canal") // Palindromes not yet computed
x.headOption                        // Compute the first one: Some(ana)
x.toSet                             // Compute the rest: Set(n, ana, a, " ", l, c)

您可能还会考虑Range.toStream

答案 1 :(得分:0)

您可以稍微提高第二种方法的性能:

def longestPalindrome3(haystack: String): String =
    (for {
      substrSize <- haystack.length to 1 by -1
      substr <- haystack.sliding(substrSize)
      if (isPalindrome(substr))
    } yield substr).headOption.getOrElse("")