मान लीजिए कि हमारे पास दो शब्द हैं शब्द 1 और शब्द 2, हमें शब्द 1 से शब्द 2 तक संगीत कार्यक्रम के लिए आवश्यक न्यूनतम संक्रियाओं की संख्या ज्ञात करनी है। ऑपरेशन तीन प्रकार के हो सकते हैं, ये हैं एक कैरेक्टर डालें, एक कैरेक्टर को डिलीट करें और एक कैरेक्टर को बदलें। इसलिए यदि इनपुट स्ट्रिंग्स "मूल्यांकन" और "उतार-चढ़ाव" हैं, तो परिणाम 5 होगा।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
n :=w1 का आकार, m :=w2 का आकार,
-
n + 1
आकार का एक सरणी dp बनाएँ -
मेरे लिए 0 से n की सीमा में
-
dp[i] :=आकार की नई सरणी m + 1
-
j के लिए 0 से m की सीमा में -
-
डीपी [आई, जे]:=0
-
अगर मैं =0, तो डीपी [i, जे] =जे
-
अन्यथा जब j =0, तब dp[i, j] :=i
-
-
-
w1 :=रिक्त स्थान और संयोजन w1, w2 :=रिक्त स्थान और संयोजित w2
-
मैं के लिए 1 से n की सीमा में
-
j के लिए 1 से m की सीमा में
-
अगर w1[i] w2[j] नहीं है, तो dp[i, j] :=1 + min of dp[i-1, j], dp[i, j-1], dp[i-1, j - 1]
-
अन्यथा dp[i, j] :=dp[i – 1, j – 1]
-
-
-
वापसी डीपी [एन, एम]
उदाहरण
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
#include <bits/stdc++.h> using namespace std; class Solution { public: int minDistance(string w1, string w2) { int n = w1.size(); int m =w2.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; } } w1 = " " + w1; w2 = " " + w2; for(int i =1;i<=n;i++){ for(int j = 1;j<=m;j++){ if(w1[i] !=w2[j]){ dp[i][j] = 1+min({dp[i-1][j],dp[i][j-1],dp[i1][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