1. 程式人生 > >編輯距離問題的動態規劃分析

編輯距離問題的動態規劃分析

1、實踐題目

編輯距離問題

2、問題描述

設A和B是2個字串,對於給定的字串A和字串B,要用最少的字元操作(包括①刪除一個字元;②插入一個字元;③將一個字元改為另一個字元)將字串A轉換為字串B

而將字串A變換為字串B所用的最少字元運算元稱為字串A到 B的編輯距離,記為d(A,B)。 計算A和B的編輯距離 d(A,B)

輸入格式:第一行是字串A,檔案的第二行是字串B,如:A字串是:fxpimu,B字串是:xwrs

輸出格式:輸出編輯距離 d(A,B),則上述樣例的輸出結果是:5

3、演算法描述

(1)定義一個二維陣列dist[m][n],表示處理字串A的第m個字元和字串B 的第n個字元後此時的已經完成的編輯距離d

(2)初始化陣列dist,將其第一行和第一列初始化為1、2、3···m和1、2、3···n,表示當字串B為空時或者字串A為空時的編輯距離d。

(3)用i和j分別指向字串A和B的單個字元

(4)刪除、增加:dist[i][j-1]+1、dist[i-1][j]+1

(5)替換:首先判斷字串A的第i-1個,與字串B的j-1個是否相同,如果相同,則dist[i-1][j-1]不變,否則dist[i-1][j-1]=dist[i-1][j-1]+1

(6)具體程式碼

 1 import java.util.Scanner;
 2 public class Main {
 3     public
static void main(String[] args) { 4 Scanner input = new Scanner(System.in); 5 String stringA = input.next(); 6 String stringB = input.next(); 7 int lengthA = stringA.length(); 8 int lengthB = stringB.length(); 9 int[][] dist = new int[lengthA+1][lengthB+1];
10 for(int i=1;i<=lengthA;i++) { 11 dist[i][0] = i; 12 } 13 for(int j=1;j<=lengthB;j++) { 14 dist[0][j] = j; 15 } 16 for(int i=1;i<=lengthA;i++) { 17 for(int j=1;j<=lengthB;j++) { 18 if(stringA.charAt(i-1) == stringB.charAt(j-1)) { 19 dist[i-1][j-1] = dist[i-1][j-1]; 20 } 21 else { 22 dist[i-1][j-1] = dist[i-1][j-1]+1; 23 } 24 dist[i][j] = Math.min(Math.min(dist[i][j-1]+1,dist[i-1][j]+1),dist[i-1][j-1]); 25 } 26 } 27 System.out.println(dist[lengthA][lengthB]); 28 } 29 }

4、演算法的時間和空間複雜度

 時間複雜度:演算法部分在雙重迴圈中執行,第一重迴圈次數為n,第二重迴圈次數為m,故時間複雜度為O(n*m)

空間複雜度:由於定義了一個二維陣列,故空間複雜度為O(n*m)

5、心得體會

 一開始題目沒怎麼看懂,和隊員一起分析了一會兒後大概地理解了題目,但是不知道應該如何用動態規劃演算法解決它,在網上查了一些資料,但也不是很懂他們的思路,最後請教了ACM大佬迪鴻同學,他很認真細緻地給我們組講解了這道題目的整個演算法過程,讓我們醍醐灌頂、受益匪淺,感謝大佬!