Check if edit distance between two strings is one - GeeksforGeeks

20 Jan, 2022
An edit between two strings is one of the following changes.  
Add a characterDelete a characterChange a character
Add a character
Delete a character
Change a character
Given two string s1 and s2, find if s1 can be converted to s2 with exactly one edit. Expected time complexity is O(m+n) where m and n are lengths of two strings. Examples:  
Input:  s1 = "geeks", s2 = "geek"
Output: yes
Number of edits is 1

Input:  s1 = "geeks", s2 = "geeks"
Output: no
Number of edits is 0

Input:  s1 = "geaks", s2 = "geeks"
Output: yes
Number of edits is 1

Input:  s1 = "peaks", s2 = "geeks"
Output: no
Number of edits is 2
 
A Simple Solution is to find Edit Distance using Dynamic programming. If distance is 1, then return true, else return false. Time complexity of this solution is O(n2)An Efficient Solution is to simultaneously traverse both strings and keep track of count of different characters. Below is complete algorithm. 
Let the input strings be s1 and s2 and lengths of input 
strings be m and n respectively.

1) If difference between m an n is more than 1, 
     return false.
2) Initialize count of edits as 0.
3) Start traversing both strings from first character.
    a) If current characters don't match, then
       (i)   Increment count of edits
       (ii)  If count becomes more than 1, return false
       (iii) If length of one string is more, then only
             possible  edit is to remove a character.
             Therefore, move ahead in larger string.
       (iv)  If length is same, then only possible edit
             is to  change a character. Therefore, move
             ahead in both strings. 
    b) Else, move ahead in both strings. 
Below is the implementation of the above idea : 
C++
Java
Python3
C#
PHP
Javascript
// C++ program to check if given two strings are// at distance one.#include <bits/stdc++.h>using namespace std; // Returns true if edit distance between s1 and// s2 is one, else falsebool isEditDistanceOne(string s1, string s2){    // Find lengths of given strings    int m = s1.length(), n = s2.length();     // If difference between lengths is more than    // 1, then strings can't be at one distance    if (abs(m - n) > 1)        return false;     int count = 0; // Count of edits     int i = 0, j = 0;    while (i < m && j < n)    {        // If current characters don't match        if (s1[i] != s2[j])        {            if (count == 1)                return false;             // If length of one string is            // more, then only possible edit            // is to remove a character            if (m > n)                i++;            else if (m< n)                j++;            else //Iflengths of both strings is same            {                i++;                j++;            }                         // Increment count of edits            count++;        }         else // If current characters match        {            i++;            j++;        }    }     // If last character is extra in any string    if (i < m || j < n)        count++;     return count == 1;} // Driver programint main(){   string s1 = "gfg";   string s2 = "gf";   isEditDistanceOne(s1, s2)?           cout << "Yes": cout << "No";   return 0;}
// Java program to check if given// two strings are at distance one.class GFG{// Returns true if edit distance// between s1 and s2 is one, else falsestatic boolean isEditDistanceOne(String s1,                                 String s2){    // Find lengths of given strings    int m = s1.length(), n = s2.length();     // If difference between lengths is    // more than 1, then strings can't    // be at one distance    if (Math.abs(m - n) > 1)        return false;     int count = 0; // Count of edits     int i = 0, j = 0;    while (i < m && j < n)    {        // If current characters don't match        if (s1.charAt(i) != s2.charAt(j))        {            if (count == 1)                return false;             // If length of one string is            // more, then only possible edit            // is to remove a character            if (m > n)                i++;            else if (m< n)                j++;            else // Iflengths of both strings                // is same            {                i++;                j++;            }                         // Increment count of edits            count++;        }         else // If current characters match        {            i++;            j++;        }    }     // If last character is extra    // in any string    if (i < m || j < n)        count++;     return count == 1;} // driver codepublic static void main (String[] args){    String s1 = "gfg";    String s2 = "gf";    if(isEditDistanceOne(s1, s2))        System.out.print("Yes");    else        System.out.print("No");}} // This code is contributed by Anant Agarwal.
# Python program to check if given two strings are# at distance one # Returns true if edit distance between s1 and s2 is# one, else falsedef isEditDistanceOne(s1, s2):     # Find lengths of given strings    m = len(s1)    n = len(s2)     # If difference between lengths is more than 1,    # then strings can't be at one distance    if abs(m - n) > 1:        return false     count = 0    # Count of isEditDistanceOne     i = 0    j = 0    while i < m and j < n:        # If current characters dont match        if s1[i] != s2[j]:            if count == 1:                return false             # If length of one string is            # more, then only possible edit            # is to remove a character            if m > n:                i+=1            elif m < n:                j+=1            else:    # If lengths of both strings is same                i+=1                j+=1             # Increment count of edits            count+=1         else:    # if current characters match            i+=1            j+=1     # if last character is extra in any string    if i < m or j < n:        count+=1     return count == 1 # Driver programs1 = "gfg"s2 = "gf"if isEditDistanceOne(s1, s2):    print ("Yes")else:    print ("No") # This code is contributed by Bhavya Jain
// C# program to check if given// two strings are at distance one.using System; class GFG{ // Returns true if edit distance// between s1 and s2 is one, else falsestatic bool isEditDistanceOne(String s1,                              String s2){         // Find lengths of given strings    int m = s1.Length, n = s2.Length;     // If difference between lengths is    // more than 1, then strings can't    // be at one distance    if (Math.Abs(m - n) > 1)        return false;         // Count of edits        int count = 0;        int i = 0, j = 0;             while (i < m && j < n)    {        // If current characters        // don't match        if (s1[i] != s2[j])        {            if (count == 1)                return false;             // If length of one string is            // more, then only possible edit            // is to remove a character            if (m > n)                i++;            else if (m< n)                j++;                              // If lengths of both             // strings is same            else            {                i++;                j++;            }                         // Increment count of edits            count++;        }         // If current characters match        else        {            i++;            j++;        }    }     // If last character is extra    // in any string    if (i < m || j < n)        count++;     return count == 1;} // Driver codepublic static void Main (){    String s1 = "gfg";    String s2 = "gf";    if(isEditDistanceOne(s1, s2))        Console.WriteLine("Yes");    else        Console.WriteLine("No");}} // This code is contributed by Sam007.
<?php// PHP program to check if given// two strings are at distance one. // Returns true if edit distance// between s1 and s2 is one, else// falsefunction isEditDistanceOne($s1, $s2){         // Find lengths of given strings    $m = strlen($s1);    $n = strlen($s2);     // If difference between    // lengths is more than    // 1, then strings can't    // be at one distance    if (abs($m - $n) > 1)        return false;     // Count of edits    $count = 0;     $i = 0; $j = 0;    while ($i < $m && $j < $n)    {        // If current characters        // don't match        if ($s1[$i] != $s2[$j])        {            if ($count == 1)                return false;             // If length of one string is            // more, then only possible edit            // is to remove a character            if ($m > $n)                $i++;            else if ($m< $n)                $j++;                              // If lengths of both             // strings is same            else            {                $i++;                $j++;            }                         // Increment count of edits            $count++;        }         // If current characters        // match        else        {            $i++;            $j++;        }    }     // If last character is    // extra in any string    if ($i < $m || $j < $n)        $count++;     return $count == 1;} // Driver Code$s1 = "gfg";$s2 = "gf";if(isEditDistanceOne($s1, $s2))    echo "Yes";else    echo "No"; // This code is contributed by nitin mittal.?>
<script>    // Javascript program to check if given    // two strings are at distance one.         // Returns true if edit distance    // between s1 and s2 is one, else false    function isEditDistanceOne(s1, s2)    {         // Find lengths of given strings        let m = s1.length, n = s2.length;         // If difference between lengths is        // more than 1, then strings can't        // be at one distance        if (Math.abs(m - n) > 1)            return false;             // Count of edits            let count = 0;            let i = 0, j = 0;         while (i < m && j < n)        {            // If current characters            // don't match            if (s1[i] != s2[j])            {                if (count == 1)                    return false;                 // If length of one string is                // more, then only possible edit                // is to remove a character                if (m > n)                    i++;                else if (m< n)                    j++;                  // If lengths of both                 // strings is same                else                {                    i++;                    j++;                }                 // Increment count of edits                count++;            }             // If current characters match            else            {                i++;                j++;            }        }         // If last character is extra        // in any string        if (i < m || j < n)            count++;         return count == 1;    }         let s1 = "gfg";    let s2 = "gf";    if(isEditDistanceOne(s1, s2))        document.write("Yes");    else        document.write("No");         // This code is contributed by decode2207.</script>
Output: 
Yes
Time complexity: O(n) Auxiliary Space: O(1)Thanks to Gaurav Ahirwar for suggesting above solution.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above 
Sam007
nitin mittal
decode2207
amartyaghoshgfg
Strings
Strings
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Python program to check if a string is palindrome or not
Check for Balanced Brackets in an expression (well-formedness) using Stack
Different methods to reverse a string in C/C++
KMP Algorithm for Pattern Searching
Convert string to char array in C++
Array of Strings in C++ (5 Different Ways to Create)
Longest Palindromic Substring | Set 1
Caesar Cipher in Cryptography
Reverse words in a given string
Check whether two strings are anagram of each other