我想在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
,尽管它是可变的,因为我没有找到其他以相反顺序迭代字符串的方法。您如何建议修复/改进它?