查找給定的字符串是使用scala的另一個字符串的子字符串的次數的優雅方式是什麼?查找給定的字符串是使用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的高階函數而不是遞歸和匹配/ case子句。
那麼......我會建議你遠離尋找一條襯裏的誘惑。首先嚐試着重於解決方案的「時間複雜性」。只有在照顧到這一點之後,才能尋找單行或高雅。試着想一個避免使用子字符串(這實際上是O(n))的時間使用的解決方案,使得你的解決方案的性能非常差。 –
類似的'.tail'對於String也是O(n),應該避免。 –
好點,我錯過了它。 – GA1