如何检查一对单词是否只有1个字母不同?

JaT*_*aTo 2 ruby string methods

在编写比较2个单词的方法时,如何检查单词是否只有1个字母不同?我假设单词长度相同,字母顺序无关紧要(参见"眼镜蛇","bravo").

def one_letter_apart?(word1, word2)
Run Code Online (Sandbox Code Playgroud)

我期待以下结果:

one_letter_apart?("abra","abro") == true
one_letter_apart?("cobra","bravo") == true
one_letter_apart?("bravo","tabby") == false
one_letter_apart?("abc","cab") == false
Run Code Online (Sandbox Code Playgroud)

我已经尝试了一些操作它们的方法(拆分,排序,然后设置相等并添加到新数组,然后计数),但到目前为止都没有.任何想法都非常感谢.

Tod*_*obs 5

检查 Levenshtein 距离

你想要Levenstein 距离。例如,使用文本 gem

require 'text'

def one_letter_apart? string1, string2
  Text::Levenshtein.distance(string1, string2).eql? 1
end

one_letter_apart? "abra", "abro"
# => true 
one_letter_apart? "cobra", "bravo"
# => false 
Run Code Online (Sandbox Code Playgroud)

  • 问题是眼镜蛇和布拉沃是一个字母。如果我理解正确,您可以通过在计算编辑距离之前对字符串进行排序来解决此问题。 (2认同)

ste*_*lag 5

这一个利用了String#sub只替换它找到的第一件事实的事实.

def one_different_char?(str, other)
  other_str = other.dup
  str.chars{|char| other_str.sub!(char, '')} #sub! just replaces just one occurence of char
  other_str.size == 1
end


test_set = [["abra","abro"],["cobra","bravo"],["bravo","tabby"],["abc","cab"]]
test_set.each{|first, second| puts one_different_char?(first, second) }

#true
#true
#false
#false
Run Code Online (Sandbox Code Playgroud)