最长的常见后缀



我想在scala中找到两个字符串的最长常见后缀。

def longestSuffix(s1: String, s2: String) = {
  val it = (s1.reverseIterator zip s2.reverseIterator) takeWhile {case (x, y) => x == y}
  it.map (_._1).toList.reverse.mkString
}

此代码笨拙,可能效率低下(例如,由于逆转)。如何找到最长的常见后缀功能,即没有可变变量?

改进的一种方法是在上次操作中连接反向和映射:

str1.reverseIterator.zip(str2.reverseIterator).takeWhile( c => c._1 == c._2)
.toList.reverseMap(c => c._1) mkString ""

首先列出一个列表,然后逆转此列表

我们可以在子字上迭代,而不会反面:

def longestSuffix(s1: String, s2: String) = {
  s1.substring(s1.length to 0 by -1 takeWhile { n => s2.endsWith(s1.substring(n)) } last)
}

tails产生子弦,然后返回第一个适合。

def longestSuffix(s1: String, s2: String) =
  s1.tails.dropWhile(!s2.endsWith(_)).next

通过在两个输入的较短上调用tails来获得一些效率。

我想出了这样的解决方案:

def commonsuffix(s1:string,s2:string):string = {  val n =(s1。逆转录术语zip s2.逆向介质器)//可变!            .takewhile {case(a,b)=> a == B}            。尺寸  s1.substring(s1.engength -n)//是否有效?} 

请注意,我正在使用substring提高效率(不确定是否正确)。

该解决方案也不是完全"功能性的",因为我使用的是reverseIterator ,尽管它是可变的,因为我没有找到其他以相反顺序迭代字符串的方法。您如何建议修复/改进它?

最新更新