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

ลบการดำเนินการสำหรับสองสตริงใน C ++


สมมติว่าเรามีคำสองคำ w1 และ w2 เราต้องหาจำนวนขั้นตอนขั้นต่ำที่จำเป็นในการทำให้ w1 และ w2 เหมือนกัน โดยในแต่ละขั้นตอน เราสามารถลบอักขระหนึ่งตัวในสตริงใดก็ได้ . ดังนั้นหากอินพุตเป็นเหมือน "ทะเล" และ "กิน" ผลลัพธ์จะเป็น 2 เนื่องจากเราต้องลบ 's' ออกจาก w1 นี่จะเป็น "ea" และลบ "t" ออกจาก "eat" จาก w2 แล้วพวกเขาก็เหมือนกัน

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้

  • n :=ขนาดของ s1, m :=ขนาดของ s2
  • เพิ่มช่องว่างก่อนสตริง s1 และ s2 จากนั้นอัปเดต s1 และ s2 ตามลำดับ
  • สร้างตารางขนาดหนึ่งตาราง (n + 1) x (m + 1)
  • สำหรับ i :=1 ถึง m
    • dp[0, i] :=dp[0, i - 1] + 1
  • สำหรับ i :=1 ถึง n
    • dp[i, 0] :=dp[i – 1, 0] + 1
  • สำหรับฉันอยู่ในช่วง 1 ถึง n
    • สำหรับ j ในช่วง 1 ถึง m
      • ถ้า s1[i] =s2[j]
        • dp[i, j] :=dp[i – 1, j - 1]
      • อย่างอื่น dp[i, j] =ขั้นต่ำของ dp[i – 1, j] + 1 และ dp[i, j - 1] + 1
  • ส่งคืน dp[n, m]

ตัวอย่าง(C++)

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น −

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   int minDistance(string s1, string s2) {
      int n = s1.size();
      int m = s2.size();
      s1 = " " + s1;
      s2 = " " + s2;
      vector < vector <int> > dp(n + 1, vector <int>(m + 1));
      for(int i = 1; i <= m; i++){
         dp[0][i] = dp[0][i - 1] + 1;
      }
      for(int i = 1; i <= n; i++){
         dp[i][0] = dp[i - 1][0] + 1;
      }
      for(int i = 1; i <= n; i++){
         for(int j = 1; j <= m; j++){
            if(s1[i] == s2[j]){
               dp[i][j] = dp[i - 1][j - 1];
            }
            else{
               dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1);
            }
         }
      }
      return dp[n][m];
   }
};
main(){
   Solution ob;
   vector<int> v = {1,1,1};
   cout << (ob.minDistance("sea", "eat"));
}

อินพุต

"sea"
"eat"

ผลลัพธ์

2