Given two strings, find if they are one edit away from each other
Here is the solution for finding the one edit in O(n). Below are the scenario, I have covered in the implementation.
- The length difference between two input strings should not be more than 1.
- When the length of the strings is same, the number of different chars should not be more than 1.
- If the length difference is 1, then either one char can be inserted in the short string or deleted from the longer string. Considering that, the number of different char should not be more than 1.
private static boolean isOneEdit(String first, String second) {
// if the input string are same
if (first.equals(second))
return false;
int len1 = first.length();
int len2 = second.length();
// If the length difference of the stings is more than 1, return false.
if ((len1 - len2) > 1 || (len2 - len1) > 1 ) {
return false;
}
int i = 0, j = 0;
int diff = 0;
while (i<len1 && j<len2) {
char f = first.charAt(i);
char s = second.charAt(j);
if (f != s) {
diff++;
if (len1 > len2)
i++;
if (len2 > len1)
j++;
if (len1 == len2)
i++; j++;
}
else{
i++; j++;
}
if (diff > 1) {
return false;
}
}
// If the length of the string is not same. ex. "abc" and "abde" are not one edit distance.
if (diff == 1 && len1 != len2 && (i != len1 || j != len2)) {
return false;
}
return true;
}
In the dynamic programming method, frequently a matrix is used. The rows correspond to one string, and the columns to the other. The point is to find the cheapest path from the top-left cell to the bottom right. At any point, a horizontal or vertical transition stands for an insertion.
Your problem is the same, but the paths are restricted. With k insertions/deletions, the path is restricted to be in the k-diagonal. Other than that, the classical DP algorithm should work. The complexity is linear.