---
# System prepended metadata

title: Edit Distance
tags: [高等演算法]

---

Edit Distance
===
### 題目
給定兩字串 s 和 t，求出 s 轉成 t 的最少編輯次數。
![image](https://hackmd.io/_uploads/HJWKdQFup.png)

### 解法
**暫時不考慮 Copy & Twiddle，因為會需要中介字串 z 以及定義上會小小複雜，這裡用不到。**
假設替換、刪除和插入的編輯成本皆為 1。

定義 D[i, j] 為字串 s[i: len(s)] 轉成字串 t[j: len(t)] 的最少編輯次數。
若 $s[i] = t[j]$，則不用編輯，D[i, j] = D[i + 1, j + 1]。
若 $s[i] \ne t[j]$，則考慮以下情況 : 
Case 1: 替換，將字元 s[i] 替換成 t[j]，問題縮小成將字串 s[i + 1: len(s)] 轉成 t[j + 1: len(t)]，所以編輯次數為 D[i, j] = 1 + D[i + 1, j + 1]。

Case 2: 刪除，刪除字元 s[i]，則問題縮小成將字串 s[i + 1: len(s)] 轉成 t[j: len(t)]，所以編輯次數為 D[i, j] = 1 + D[i + 1, j]。

Case 3: 插入，將 t[j] 插入 s[i] 之前，則問題縮小成將字串 s[i: len(s)] 轉成 t[j + 1: len(t)]，所以編輯次數為 D[i, j] = 1 + D[i, j + 1]。

Case 4: Twiddle，交換字元 s[i] 和 s[i + 1] 的位置，則問題縮小成將字串 s[i + 2: len(s)] 轉成 t[j + 2: len(t)]，需要一個暫存變數 temp 來交換，所以編輯次數為 D[i, j] = 3 + D[i + 2, j + 2]。

取出 Case 1 ~ 4 的最小值，即為 D[i, j] = min(1 + D[i + 1, j + 1], 1 + D[i + 1, j + 1], 1 + D[i, j + 1], 3 + D[i + 2, j + 2])

邊界條件 : 
1. 若兩字串為空字串，則編輯次數為 0。
2. 若 t 為空字串，s 不為空字串，則編輯次數為 len(s)，即刪除 len(s) 個字元就能變成空字串。
3. 若 s 為空字串，t 不為空字串，則編輯次數為 len(t)，即插入 len(t) 個字元就能變成 t 字串。

* [clrs solution : 有複製和交換功能，含中介字串 z](https://walkccc.me/CLRS/Chap15/Problems/15-5/)
### 遞迴式
### 實作