Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

โปรแกรมค้นหาระยะการแก้ไขขั้นต่ำระหว่างสองสตริงใน C++


สมมติว่าเรามีคำสองคำ 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