Last active
January 30, 2018 02:28
-
-
Save sooop/3cdfcf38d5ec607438e63fe3a9d6e9bc to your computer and use it in GitHub Desktop.
문자열의 편집거리 구하기
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
private extension String { | |
subscript(i:Int) -> Character { | |
let idx = index(startIndex, offsetBy: i) | |
return self[idx] | |
} | |
} | |
struct Array2D<T> { | |
let width: Int, height: Int | |
var length: Int { return width * height } | |
var data: [T?] | |
var last: T? { return data.last! } | |
init(width:Int, height: Int) { | |
self.width = width | |
self.height = height | |
data = Array<T?>(repeating:nil, count: width * height) | |
} | |
subscript(row: Int, col: Int) -> T? { | |
get { | |
guard case (0..<length) = row * col, | |
case (0..<width) = col, | |
case (0..<height) = row | |
else { return nil } | |
return data[row*width + col] | |
} | |
set { | |
guard case (0..<length) = row * col, | |
case (0..<width) = col, | |
case (0..<height) = row | |
else { return } | |
data[row*width + col] = newValue | |
} | |
} | |
subscript(i:Int) -> T? { | |
get { return data[i] } | |
set { data[i] = newValue } | |
} | |
} | |
public extension String { | |
func editDistance(to s: String) -> Int { | |
var grid = Array2D<Int>(width: s.count+1, height: count+1) | |
(0...count).forEach{ grid[$0, 0] = $0 } | |
(0...s.count).forEach{ grid[0, $0] = $0 } | |
for i in 1...count { | |
for j in 1...s.count { | |
if let x = grid[i, j-1], | |
let y = grid[i-1, j], | |
let z = grid[i-1, j-1] | |
{ | |
grid[i, j] = Swift.min(x+1, y+1, z + (self[i-1] == s[j-1] ? 0 : 1)) | |
} | |
} | |
} | |
return grid.last! | |
} | |
} | |
let s = "hello" | |
print(s.editDistance(to:"helloworld")) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment