forked from TheAlgorithms/Java
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request TheAlgorithms#226 from sanghaisubham/editdistance
Implementation of Edit Distance in Java
- Loading branch information
Showing
1 changed file
with
89 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
/** | ||
Author : SUBHAM SANGHAI | ||
A Dynamic Programming based solution for Edit Distance problem In Java | ||
**/ | ||
|
||
/**Description of Edit Distance with an Example: | ||
Edit distance is a way of quantifying how dissimilar two strings (e.g., words) are to one another, | ||
by counting the minimum number of operations required to transform one string into the other. The | ||
distance operations are the removal, insertion, or substitution of a character in the string. | ||
The Distance between "kitten" and "sitting" is 3. A minimal edit script that transforms the former into the latter is: | ||
kitten → sitten (substitution of "s" for "k") | ||
sitten → sittin (substitution of "i" for "e") | ||
sittin → sitting (insertion of "g" at the end).**/ | ||
|
||
import java.util.Scanner; | ||
public class Edit_Distance | ||
{ | ||
|
||
|
||
|
||
public static int minDistance(String word1, String word2) | ||
{ | ||
int len1 = word1.length(); | ||
int len2 = word2.length(); | ||
// len1+1, len2+1, because finally return dp[len1][len2] | ||
int[][] dp = new int[len1 + 1][len2 + 1]; | ||
/* If second string is empty, the only option is to | ||
insert all characters of first string into second*/ | ||
for (int i = 0; i <= len1; i++) | ||
{ | ||
dp[i][0] = i; | ||
} | ||
/* If first string is empty, the only option is to | ||
insert all characters of second string into first*/ | ||
for (int j = 0; j <= len2; j++) | ||
{ | ||
dp[0][j] = j; | ||
} | ||
//iterate though, and check last char | ||
for (int i = 0; i < len1; i++) | ||
{ | ||
char c1 = word1.charAt(i); | ||
for (int j = 0; j < len2; j++) | ||
{ | ||
char c2 = word2.charAt(j); | ||
//if last two chars equal | ||
if (c1 == c2) | ||
{ | ||
//update dp value for +1 length | ||
dp[i + 1][j + 1] = dp[i][j]; | ||
} | ||
else | ||
{ | ||
/* if two characters are different , | ||
then take the minimum of the various operations(i.e insertion,removal,substitution)*/ | ||
int replace = dp[i][j] + 1; | ||
int insert = dp[i][j + 1] + 1; | ||
int delete = dp[i + 1][j] + 1; | ||
|
||
int min = replace > insert ? insert : replace; | ||
min = delete > min ? min : delete; | ||
dp[i + 1][j + 1] = min; | ||
} | ||
} | ||
} | ||
/* return the final answer , after traversing through both the strings*/ | ||
return dp[len1][len2]; | ||
} | ||
|
||
|
||
// Driver program to test above function | ||
public static void main(String args[]) | ||
{ | ||
Scanner input = new Scanner(System.in); | ||
String s1,s2; | ||
System.out.println("Enter the First String"); | ||
s1 = input.nextLine(); | ||
System.out.println("Enter the Second String"); | ||
s2 = input.nextLine(); | ||
//ans stores the final Edit Distance between the two strings | ||
int ans=0; | ||
ans=minDistance(s1,s2); | ||
System.out.println("The minimum Edit Distance between \"" + s1 + "\" and \"" + s2 +"\" is "+ans); | ||
} | ||
} |