Levenshtein在Swift3中的距离

sty*_*l3r 1 levenshtein-distance rosetta-code swift swift3

我正在使用Rosetta Code的教程来计算Levenshtein距离.看起来他们的代码在Swift2中,所以我Binary operator '+' cannot be applied to operands of type '[Int]' and 'Repeated<String.CharacterView>'这样做时会出现这个错误:var cur = [i + 2] + emptywhere let empty = repeatElement(s, count: 0).我怎么能这样做?

ada*_*oto 5

有几个变化要做.

  • 数组的构造为空.
  • 现在枚举enumerate()()
  • successor()不再存在,所以我用+1替换它

所以功能现在

斯威夫特4:

func levDis(_ w1: String, _ w2: String) -> Int {
    let empty = [Int](repeating:0, count: w2.count)
    var last = [Int](0...w2.count)

    for (i, char1) in w1.enumerated() {
        var cur = [i + 1] + empty
        for (j, char2) in w2.enumerated() {
            cur[j + 1] = char1 == char2 ? last[j] : min(last[j], last[j + 1], cur[j]) + 1
        }
        last = cur
    }
    return last.last!
}
Run Code Online (Sandbox Code Playgroud)

斯威夫特3:

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!
}
Run Code Online (Sandbox Code Playgroud)