0

please note that it doesn't require to really calculate Levenshtein edit distance. just check it's 1 or not.

The signature of the method may look like this:

bool Is1EditDistance(string s1, string s2). 

for example: 1. "abc" and "ab" return true 2. "abc" and "aebc" return true 3. "abc" and "a" return false.

I've tried recursive approve, but it it not efficient.


update: got answer from a friend:

        for (int i = 0; i < s1.Length && i < s2.Length; i++)
        {
            if (s1[i] != s2[i])
            {
                return s1.Substring(i + 1) == s2.Substring(i + 1)   //case of change
                    || s1.Substring(i + 1) == s2.Substring(i)       //case of s1 has extra
                    || s1.Substring(i) == s2.Substring(i + 1);      //case of s2 has extra
            }
        }
        return Math.Abs(s1.Length - s2.Length) == 1;
lidong
  • 556
  • 1
  • 4
  • 20

1 Answers1

7

If you only care if the distance is exactly 1 or not, you can do something like this:

  • If the difference of the strings' lengths is not 0 or 1, return false.
  • If both strings have length n, loop i = 0..n checking s1[i] == s2[i] for all i except one.
  • If the strings have length n and n+1, let i be the smallest index where s1[i] != s2[i], then loop j=i..n checking s1[j] == s2[j+1] for all j.
verdesmarald
  • 11,646
  • 2
  • 44
  • 60
  • This is the most efficient solution. This is far superior to running a variant of the levenshtein algorithm where a max distance is specified and you give up once it becomes apparent that the max distance has been exceeded. – damzam Sep 28 '12 at 05:32