2012-09-28 2 views
1

실제로 편집 거리를 계산할 필요가 없습니다. 그냥 1인지 확인하십시오.Levenshtein 편집 거리가 1 문자열인지 확인하는 방법

메소드의 서명은 다음과 같이 보일 수 있습니다 :

예를 들어
bool Is1EditDistance(string s1, string s2). 

: 1. "ABC"와 "AB"반환 사실 2. "abc 방송"과 "aebc"true를 반환 3 "abc"및 "a"는 false를 반환합니다.

재귀 적 승인을 시도했지만 효율적이지 않습니다.


업데이트 : 거리가 정확히 1인지 아닌지 만 신경 경우

 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; 
+0

편집 거리는 어느 것입니까? 레벤 시틴? 해밍? – Bitwise

+0

이 질문을 좀 더 자세히 설명해 주시겠습니까? 아마도 당신이 시도한 것을 말해 줄 수 있습니까? – senderle

+0

B/W 문자열로 정의 된 여러 유형의 거리가 있습니다 .Jaro-Winkler 거리, Hamming, Levenshtein ... 어느 것이죠? –

답변

6

, 당신은 같은 것을 할 수 있습니다 :

  • 경우] 친구의 대답을 얻었다 문자열 길이의 차이가 0 또는 1이 아닌 경우 false를 반환합니다.
  • 두 문자열의 길이가 모두 n 인 경우 루프 i = 0..ns1[i] == s2[i]을 확인하십시오. 모두 i (하나만 제외)입니다. 문자열의 길이 nn+1이있는 경우
  • , is1[i] != s2[i], 다음 루프 j=i..n 모든 j에 대한 s1[j] == s2[j+1]을 확인하는 가장 작은 인덱스가 될 수 있습니다.
+0

이것은 가장 효율적인 솔루션입니다. 이것은 최대 거리가 명시된 levenshtein 알고리즘의 변형을 실행하는 것보다 훨씬 뛰어납니다. 그리고 최대 거리가 초과 된 것이 명백 해지면 포기합니다. – damzam

관련 문제