如何使用Scala找到给定字符串在另一个字符串中作为子字符串出现次数的优雅方法?
以下测试用例应该清楚说明要求:
import org.scalatest.FunSuite
class WordOccurrencesSolverTest extends FunSuite {
private val solver = new WordOccurrencesSolver()
test("solve for a in a") {
assert(solver.solve("a", "a") === 1)
}
test("solve for b in a") {
assert(solver.solve("b", "a") === 0)
}
test("solve for a in aa") {
assert(solver.solve("a", "aa") === 2)
}
test("solve for b in ab") {
assert(solver.solve("b", "ab") === 1)
}
test("solve for ab in ab") {
assert(solver.solve("ab", "ab") === 1)
}
test("solve for ab in abab") {
assert(solver.solve("ab", "abab") === 2)
}
test("solve for aa in aaa") {
assert(solver.solve("aa", "aaa") === 2)
}
}
这是我对一个问题的解决方案,虽然不太自豪:
class WordOccurrencesSolver {
def solve(word: String, text: String): Int = {
val n = word.length
def solve(acc: Int, word: String, sb: String): Int = sb match {
case _ if sb.length < n => acc
case _ if sb.substring(0, n) == word => solve(acc + 1, word, sb.tail)
case _ => solve(acc, word, sb.tail)
}
solve(0, word, text)
}
}
我认为一定有一个简洁的一行代码,可以利用Scala的高阶函数而不是递归和匹配/案例子句。
.tail
的时间复杂度也是 O(n),因此应该避免使用。 - sarveshseri