Leetcode——72.編輯距離

編輯距離

題解

對於兩個字符串,要是將一個字符串轉換爲另一個字符串,可以對一個字符串進行如下的操作。

  1. 插入一個字符
  2. 刪除一個字符
  3. 替換一個字符

那麼對於字符串AB

假設A=“examp”, B=“exam”

對於B在尾部插入一個p,那麼就相當於在B中不插入p,將A中的p這個字符刪除,同理,在A中插入一個字符,也等同於在B中刪除一個字符。

對於替換的操作,無論是對A字符還是B字符操作都是一樣的。那麼操作可以變成。

  1. A中插入一個字符
  2. B中插入一個字符
  3. 替換一個字符。

定義dp[i][j1]dp[i][j-1]表示A中字符串前ii個字符與B中字符串前j1j-1個字符的編輯距離,那麼ii個字符與jj個字符的編輯距離最小爲dp[i][j1]+1dp[i][j-1]+1

同理dp[i1][j]dp[i-1][j]爲編輯距離,那麼ii個字符與jj個字符的編輯距離最小爲dp[i1][j]+1dp[i-1][j]+1

dp[i1][j1]dp[i-1][j-1]表示A中前ii個字符與B中前jj個字符的編輯距離,那麼如果A[i]=B[j]A[i]=B[j],那麼編輯距離最小爲dp[i1][j1]dp[i-1][j-1],如果A[i]B[j]A[i]\ne B[j],那麼編輯距離最小爲dp[i1][j1]+1dp[i-1][j-1]+1

因此轉移方程爲

  • A[i]=B[j]A[i]=B[j]

    • dp[i][j]=min(dp[i1][j]+1,dp[i][j1]+1,dp[i1][j1]) dp[i][j] = \min(dp[i-1][j]+1, dp[i][j-1]+1,dp[i-1][j-1])
  • A[i]B[j]A[i]\ne B[j]

    • dp[i][j]=min(dp[i1][j]+1,dp[i][j1]+1,dp[i1][j1]+1) dp[i][j] = \min(dp[i-1][j]+1, dp[i][j-1]+1, dp[i-1][j-1]+1)

對於動態規劃的初始化

那麼dp[0][i]dp[0][i]dp[i][0]dp[i][0]都表示從空字符串轉換到對應的字符串,
dp[0][i]=ii=1len1dp[i][0]=ii=1len2 dp[0][i] = i \quad i = 1 \cdots len1 \\dp[i][0] = i \quad i = 1 \cdots len2

代碼

func min(a, b int ) int {
    if a< b{
        return a
    }
    return b
}

func minDistance(word1 string, word2 string) int {
    len1 := len(word1)
    len2 := len(word2)
    dp := make([][]int, 0)
    for i:=0;i<=len1;i++ {
        temp := make([]int, len2+1)
        dp = append(dp,temp)
    }

    for i:=1;i<=len1;i++{
        dp[i][0] = i
    }
    for i:=1;i<=len2;i++{
        dp[0][i] = i 
    }
    for i:=1;i<=len1;i++ {
        for j:=1;j<=len2;j++ {
            if word1[i-1] == word2[j-1] {
                dp[i][j] = min(min(dp[i][j-1]+1,dp[i-1][j]+1),dp[i-1][j-1])
            } else {
                dp[i][j] = min(min(dp[i][j-1]+1,dp[i-1][j]+1),dp[i-1][j-1] + 1)
            }
        }
    }
    return dp[len1][len2]
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章