2

这些天我用谷歌搜索,但没有任何帮助。我现在不确定它是否可能,所以我想我只是在 stackoverflow 上提问。

情况:用户可以输入一个单词或在一个输入框中。当他完成一个函数时,检查单词是否在单词数组中 - 很容易。现在我想写一个帮助,如果缺少一个字母或字母写错了,应该会弹出一条消息。

搜索的关键是什么?我试过:

  • javascript在数组中查找字符串
  • javascript在数组中查找相似的单词
  • javascript正则表达式相似词
  • ... 和更多

我希望你明白我的意思,并能给我一些提示。

4

2 回答 2

11

Levenshtein 距离是用于计算相似词之间距离的度量。对于每个更改、改组或丢失的字母,距离都会增加。你可以在这里阅读更多: http ://en.wikipedia.org/wiki/Levenshtein_distance

并在此处参考不同语言的实现:http ://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance

我希望这会有所帮助,并感谢您的评论;)

于 2012-07-07T21:30:57.233 回答
1

请参阅此处了解用于检查单词之间相似性的算法。

使用那里的代码,您可以使用array.any?{|e| e.similar?(user_input)}

您可以根据需要调整阈值。当然,这是 Ruby,所以你必须翻译成 javascript...

我从那里复制了代码:

class String

  def levenstein(other, ins=2, del=1, sub=1)

    return nil if self.nil? || other.nil?

    dm = []
    dm[0] = (0..self.length).collect { |i| i * ins}
    fill = [0] * (self.length - 1)

    for i in 1..other.length
      dm[i] = [i * del, fill.flatten] 
    end

    for i in 1..other.length
      for j in 1..self.length
        dm[i][j] = [
          dm[i-1][j-1] + (self[i-1] == other[i-1] ? 0 : sub),
          dm[i][j-1] + ins,
          dm[i-1][j] + del
          ].min
      end
    end

    dm[other.length][self.length]
  end

  def similar?(other, thresh = 2)
    self.levenstein(other) < thresh
  end

end

# Tryout
"Foobar".similar?("Fuubar", 3) # => true
于 2012-07-07T21:40:26.607 回答