動態規劃----優化編輯器問題

  1. 問題描述
    Levenshtein 距離,又稱編輯距離,指的是兩個字符串之間,由一個轉換成另一個所需的最少編輯操作次數。許可的編輯操作包括將一個字符替換成另一個字符,插入一個字符,刪除一個字符。編輯距離的算法是首先由俄國科學家Levenshtein提出的,故又叫Levenshtein Distance。
    Ex:
    字符串A:abcdefg
    字符串B: abcdef
    通過增加或是刪掉字符”g”的方式達到目的。這兩種方案都需要一次操作。把這個操作所需要的次數定義爲兩個字符串的距離。
    要求:
    給定任意兩個字符串,寫出一個算法計算它們的編輯距離。
  2. 解題思路
    問題抽象:將A變爲B所需的最少操作步數(也可以是B變爲A的最少操作步數,兩個角度一樣。因爲A變爲B如果有插入的畫,對應B變爲A就可以等價爲刪除;A變爲B爲替換的話,B變爲A也可等價位替換;A變爲B爲刪除的話,B變爲A等價爲插入,因爲步數都一樣)。用dp[x][y]表示A的前x個字符轉換爲B的前y個字符所需要的最少操作步數
    最優子結構:A的前x個字符變爲B的前y個字符所需要的最少操作步數d[x][y]取決於子問題:
    1A的最後一位參與變換:
    if(A的第x個字符不等於B的第y個字符)dp[x][y]=dp[x-1][y-1]+1 //將A的前x-1個字符變爲B的前y-1個字符,然後將最後一個字符替換成B的最後一個字符(一步)
    else dp[x][y]=dp[x-1][y-1] //如果A的最後一個字符等於B的最後一個字符,則A的前x個字符變爲B的前y個字符等價於將A的前x-1個字符變爲B的前y-1個字符
    2A的最後一位不參與變換(刪除掉A的最後一位)
    dp[x][y]=dp[x-1][y]+1  //將A的前x-1個字符變爲B,然後將最後一個字符刪除
    3)B的最後一位不參與變化(刪除掉B的最後一位)
    dp[x][y]=dp[x][y-1]+1  //將B的前y-1個字符變爲A,然後將最後一個字符刪除

    dp[x][y]=min{dp[x-1][y-1]+1或dp[x-1][y-1],dp[x-1][y]+1,dp[x][y-1]+1}

    當x=0時,即A爲空字符串,則A變爲B的前Y個字符所需的操作爲y,dp[0][y]=y;
    同理,y=0時,dp[x][0]=x;
    這樣自底向上就能求出將A變爲B最少的操作步數dp[a.length][b.length].
  **動態規劃的關鍵一步就是如何就將問題與子問題聯繫起來,即將問題i想辦法用問題i-1表示**
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章