上下文:在大量文本中找到最长的回文。
这里有两个解决方案 - 一个带有'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("")
}
答案 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("")