สมมติว่าเรามีคำสองคำ S และ T เราต้องหาจำนวนการดำเนินการขั้นต่ำที่จำเป็นในการแปลงจาก S เป็น T การดำเนินการสามารถมีได้สามประเภท ได้แก่
- ใส่อักขระ
- ลบอักขระ
- แทนที่อักขระ
ดังนั้นหากสตริงอินพุตเป็น "ประเมิน" และ "ผันผวน" ผลลัพธ์จะเป็น 5
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
n :=ขนาดของ s, m :=ขนาดของ t,
-
สร้างอาร์เรย์ dp ขนาด n + 1
-
สำหรับฉันอยู่ในช่วง 0 ถึง n
-
dp[i] :=อาร์เรย์ใหม่ขนาด m + 1
-
สำหรับ j ในช่วง 0 ถึง m:
-
dp[i, j] :=0
-
ถ้า i =0 แล้ว dp[i,j] =j
-
มิฉะนั้นเมื่อ j =0, แล้ว dp[i, j] :=i
-
-
-
s :=ช่องว่างและต่อ s, t :=ช่องว่างและต่อ t
-
สำหรับฉันอยู่ในช่วง 1 ถึง n
-
สำหรับ j ในช่วง 1 ถึง m
-
ถ้า s[i] ไม่ใช่ t[j] แล้ว dp[i, j] :=1 + นาทีของ dp[i – 1, j], dp[i, j - 1], dp[i – 1, j – 1]
-
มิฉะนั้น dp[i, j] :=dp[i – 1, j – 1]
-
-
-
กลับ dp[n, m]
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; class Solution { public: int minDistance(string s, string t) { int n = s.size(); int m =t.size(); int** dp = new int*[n+1]; for(int i =0;i<=n;i++){ dp[i] = new int[m+1]; for(int j=0;j<=m;j++){ dp[i][j]=0; if(i==0)dp[i][j]=j; else if(j==0)dp[i][j] = i; } } s = " " + s; t = " " + t; for(int i =1;i<=n;i++){ for(int j = 1;j<=m;j++){ if(s[i] !=t[j]){ dp[i][j] = 1+min({dp[i-1][j],dp[i][j-1],dp[i-1][j-1]}); }else{ dp[i][j] = dp[i-1][j-1]; } } } return dp[n][m]; } }; main(){ Solution ob; cout << (ob.minDistance("fluctuate", "evaluate")); }
อินพุต
"fluctuate" "evaluate"
ผลลัพธ์
5