Advertisement
Guest User

Untitled

a guest
Sep 2nd, 2015
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.31 KB | None | 0 0
  1. import UIKit
  2. import Darwin
  3.  
  4. extension String {
  5.  
  6. subscript(index: Int) -> Character {
  7. return self[advance(startIndex, index)]
  8. }
  9.  
  10. subscript(range: Range<Int>) -> String {
  11. let start = advance(startIndex, range.startIndex)
  12. let end = advance(startIndex, range.endIndex)
  13. return self[start..<end]
  14. }
  15. }
  16.  
  17. extension String {
  18.  
  19. func levenshtein(cmpString: String) -> Int {
  20.  
  21. let (length, cmpLength) = (count(self), count(cmpString))
  22. let subArray = Array<Int>(count: length + 1, repeatedValue: 0)
  23. var matrix = Array<[Int]>(count: cmpLength + 1, repeatedValue: subArray)
  24.  
  25. for var m = 1; m <= cmpLength; m++ {
  26. matrix[m][0] = matrix[m - 1][0] + 1
  27. }
  28.  
  29. for var n = 1; n <= length; n++ {
  30. matrix[0][n] = matrix[0][n - 1] + 1
  31. }
  32.  
  33. for m in Range(start: 1, end: cmpLength + 1) {
  34. for n in Range(start: 1, end: length + 1) {
  35. let penalty = self[n - 1] == cmpString[m - 1] ? 0 : 1
  36. matrix[m][n] = min(matrix[m - 1][n] + 1, matrix[m][n - 1] + 1, matrix[m - 1][n - 1] + penalty)
  37. }
  38. }
  39.  
  40. return matrix[cmpLength][length]
  41. }
  42. }
  43.  
  44. let reference = "Hello World"
  45. assert(reference.levenshtein("Helo Wordl") == 3)
  46. assert(reference.levenshtein("") == count(reference))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement