chore(CPlusPlus): Add Edit Distance (#458)
Co-authored-by: Arsenic <54987647+Arsenic-ATG@users.noreply.github.com>pull/465/head
parent
f9a2d4d447
commit
0607b7cbdc
|
@ -0,0 +1,72 @@
|
|||
// Given two strings 's1' and 's2' and below operations that can performed on 's1'.
|
||||
// 1.Insert
|
||||
// 2.Remove
|
||||
// 3.Replace
|
||||
//Find minimum number of edits (operations) required to convert ‘s1’ into ‘s2’.
|
||||
|
||||
// NOTE: All above operations are of equal cost
|
||||
// Input: s1 = "car", s2 = "cars"
|
||||
// Output: 1
|
||||
// We can convert s1 into s2 by inserting a 's'.
|
||||
|
||||
//Program using Dynamic Programming
|
||||
//TIME COMPLEXITY: O(m*n)
|
||||
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
using namespace std;
|
||||
|
||||
// Utility function to find the minimum of three numbers
|
||||
int min(int x, int y, int z) { return min(min(x, y), z); }
|
||||
|
||||
int editDistDP(string s1, string s2, int m, int n)
|
||||
{
|
||||
vector<vector<int>> dp(m + 1, vector<int>(n + 1));
|
||||
|
||||
for (int i = 0; i <= m; i++) {
|
||||
for (int j = 0; j <= n; j++) {
|
||||
// If first string is empty, only option is to
|
||||
// insert all characters of second string
|
||||
if (i == 0)
|
||||
dp[i][j] = j; // Min. operations = j
|
||||
|
||||
// If second string is empty, only option is to
|
||||
// remove all characters of second string
|
||||
else if (j == 0)
|
||||
dp[i][j] = i; // Min. operations = i
|
||||
|
||||
// If last characters are same, ignore last char
|
||||
// and recur for remaining string
|
||||
else if (s1[i - 1] == s2[j - 1])
|
||||
dp[i][j] = dp[i - 1][j - 1];
|
||||
|
||||
// If the last character is different, consider
|
||||
// all possibilities and find the minimum
|
||||
else
|
||||
dp[i][j]
|
||||
= 1
|
||||
+ min(dp[i][j - 1], // Insert
|
||||
dp[i - 1][j], // Remove
|
||||
dp[i - 1][j - 1]); // Replace
|
||||
}
|
||||
}
|
||||
|
||||
return dp[m][n];
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
string s1, s2;
|
||||
cout << "Enter 1st string: " << '\n';
|
||||
cin >> s1;
|
||||
cout << "Enter 2nd string: " << '\n';
|
||||
cin >> s2;
|
||||
int n = s1.length();
|
||||
int m = s2.length();
|
||||
cout << editDistDP(s1, s2, n, m);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// s1: food
|
||||
// s2: money
|
||||
// output: 4
|
|
@ -21,6 +21,7 @@
|
|||
2. [Longest Common Substring](Dynamic-Programming/longest-common-substring.cpp)
|
||||
3. [0/1-knapsack](Dynamic-Programming/01-knapsack.cpp)
|
||||
4. [Matrix chain Multiplication](Dynamic-Programming/matrix-chain-multiplication.cpp)
|
||||
5. [Edit Distance](Dynamic-Programming/edit-distance.cpp)
|
||||
|
||||
## Graphs
|
||||
|
||||
|
|
Loading…
Reference in New Issue