Edit distance
Given below code is for edist spoj or edit distance spoj .
Hint:-> Standerd edit distance problem you can read it from wikipidea.
1-> Using O(nm) space (n & m are size of strings )
#include <bits/stdc++.h>
using namespace std;
int dp[3000][3000];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
char s[3000],t[3000];
scanf("%s",s);
scanf("%s",t);
int size1=strlen(s),size2 = strlen(t);
memset(dp,0,sizeof(dp[0][0])*(size1+1)*(size2+1));
for(int i=0;i<=size1;i++)
dp[i][0] = i;
for(int j=0;j<=size2;j++)
dp[0][j] = j;
for(int i=1;i<=size1;i++)
{
for(int j = 1;j<=size2;j++)
{
if(s[i-1] == t[j-1]){
dp[i][j] = dp[i-1][j-1];
}
else
dp[i][j] = min(dp[i-1][j-1]+1,min(dp[i-1][j]+1,dp[i][j-1]+1));
}
}
printf("%d\n",dp[size1][size2]);
}
return 0;
}
2-> Using O(n) space (n is size of strings )
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
char s[3000],t[3000];
scanf("%s",s);
scanf("%s",t);
int sizes = strlen(s),sizet = strlen(t);
vector<int> v1(sizet+9),v2(sizet+9);
for(int i=0;i<=sizet;i++)
v1[i] = i;
for(int i=0;i<sizes;i++)
{
v2[0] = i+1;
for(int j=0;j<sizet;j++)
{
int add;
if(s[i] == t[j])
add = 0;
else
add = 1;
v2[j+1] = min(v2[j]+1,min(v1[j+1]+1,v1[j]+add));
}
for(int i=0;i<sizet;i++)
v1[i] = v2[i];
}
printf("%d\n",v2[sizet]);
}
return 0;
}
Thanks
ReplyDelete