我使用Rosetta Code的教程來計算Levenshtein距離。看起來他們的代碼是在Swift2中,所以我在執行此操作時得到這個錯誤Binary operator '+' cannot be applied to operands of type '[Int]' and 'Repeated<String.CharacterView>'
:var cur = [i + 2] + empty
其中let empty = repeatElement(s, count: 0)
。我怎麼去解決這個問題?Swift3中的Levenshtein距離
1
A
回答
4
做了一些改變。
- 數組的構造爲空。
- 枚舉()現在枚舉()
- 繼任者(),所以我用+1
取代它不存在了這樣的功能,現在是
func levDis(w1: String, w2: String) -> Int {
let (t, s) = (w1.characters, w2.characters)
let empty = Array<Int>(repeating:0, count: s.count)
var last = [Int](0...s.count)
for (i, tLett) in t.enumerated() {
var cur = [i + 1] + empty
for (j, sLett) in s.enumerated() {
cur[j + 1] = tLett == sLett ? last[j] : min(last[j], last[j + 1], cur[j])+1
}
last = cur
}
return last.last!
}
0
更新和改進回答Swift 4,基於@Spads回答。
func levenshteinDistanceScoreTo(string: String, ignoreCase: Bool = true, trimWhiteSpacesAndNewLines: Bool = true) -> Float {
var firstString = self
var secondString = string
if ignoreCase {
firstString = firstString.lowercased()
secondString = secondString.lowercased()
}
if trimWhiteSpacesAndNewLines {
firstString = firstString.trimmingCharacters(in: .whitespacesAndNewlines)
secondString = secondString.trimmingCharacters(in: .whitespacesAndNewlines)
}
let empty = [Int](repeating:0, count: secondString.count)
var last = [Int](0...secondString.count)
for (i, tLett) in firstString.enumerated() {
var cur = [i + 1] + empty
for (j, sLett) in secondString.enumerated() {
cur[j + 1] = tLett == sLett ? last[j] : Swift.min(last[j], last[j + 1], cur[j])+1
}
last = cur
}
// maximum string length between the two
let lowestScore = max(firstString.count, secondString.count)
if let validDistance = last.last {
return 1 - (Float(validDistance)/Float(lowestScore))
}
return Float.leastNormalMagnitude
}
相關問題
- 1. Levenshtein距離成本
- 2. 反向Levenshtein距離
- 3. Levenshtein距離組合
- 4. 計算Levenshtein距離
- 5. Haskell程序Levenshtein距離
- 6. OCR:加權Levenshtein距離
- 7. Levenshtein距離與陣列
- 8. 移植C#Levenshtein距離Java
- 9. Levenshtein編輯距離Python
- 10. 同義詞由Levenshtein距離
- 11. Python中的Levenshtein距離只給出1作爲編輯距離
- 12. 正則表達式中的Levenshtein距離
- 13. R中的快速Levenshtein距離?
- 14. 句級R中的Levenshtein距離
- 15. Levenshtein Python中的距離循環
- 16. 在列表中計算levenshtein距離Python
- 17. 如何在Delphi中實現Levenshtein距離?
- 18. 在python中實現Levenshtein距離
- 19. 任意序列的Levenshtein /編輯距離
- 20. 非英語語言的Levenshtein距離
- 21. 作爲全文替代的Levenshtein距離
- 22. 基於Levenshtein距離的方法Vs Soundex
- 23. Levenshtein與擾亂字符的距離?
- 24. 顯示Levenshtein距離的結果
- 25. Damerau-Levenshtein距離的迭代版本
- 26. Damerau-Levenshtein距離的高效實現
- 27. 轉換Levenshtein錯誤率的距離
- 28. 計算的Levenshtein編輯距離
- 29. 修改Levenshtein位置偏差的距離
- 30. 水母的Damerau-Levenshtein距離計算車?
不是直接回答你的問題,但在這裏http://stackoverflow.com/questions/26990394/slow-swift-arrays-and-strings-performance是應該需要斯威夫特稍作修改的實施3. –
感謝,工作,但仍然喜歡使用他們的(羅塞塔)方法,因爲它看起來更短。 – styl3r