An edit between two strings is one of the following changes.

- 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

**We strongly recommend you to minimize your browser and try this yourself first.**

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(n^{2})

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 are C++ and Python implementations of above idea.

## C++

// 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 false 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 (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 program int main() { string s1 = "gfg"; string s2 = "gf"; isEditDistanceOne(s1, s2)? cout << "Yes": cout << "No"; return 0; }

## Python

# Python program to check if given two strings are # at distance one # Returns true if edit distance between s1 and s2 is # one, else false def 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 program s1 = "gfg" s2 = "gf" if isEditDistanceOne(s1, s2): print "Yes" else: print "No" # This code is contributed by Bhavya Jain

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