ruby - 在允许与 Ruby 不匹配的情况下查找子字符串

标签 ruby string suffix-array

我正在阅读有关在字符串中查找子字符串的后缀数组方法,请参阅 ( http://www.codeodor.com/index.cfm/2007/12/24/The-Suffix-Array/1845) 例如

sa = SuffixArray.new("abracadabra")
puts sa.find_substring("aca") 

其中 SuffixArray 是后缀数组的实现,find_substring 是一种用于搜索子字符串开始位置的方法。

我的问题是如何在允许子字符串中存在给定数量的不匹配的情况下实现此搜索?例如,

max_mismatches = 2
search_string ="abrazadabra"
substring ="aca"

sa = SuffixArray.new("search_string")
puts sa.find_substring("substring",max_mismatches)

其中不匹配可能被视为错误阈值。在这种情况下,它应该能够匹配“aza”并返回“aza”子字符串的起始位置。另请注意,“abr”有 2 个不匹配!所以应该先归还。理想情况下,该方法应返回所有可能出现的情况。

有什么想法吗?或其他解决此类问题的方法? 谢谢

最佳答案

# checks whether two strings are similar,
# allowing given number of characters of difference
def similar? a, b, mismatches = 1
  a.chars.zip(b.chars).count{|ca, cb| ca != cb} <= mismatches
end

# in haystack, find similar strings to needle
def find_similar haystack, needle, mismatches = 1
  haystack.chars.each_cons(needle.length).map(&:join).select{|s|
    similar?(s, needle, mismatches)
  }
end

find_similar 'abracadabra', 'aca'
# => ["aca", "ada"] 
find_similar 'abracadabra', 'aca', 2
# => ["abr", "bra", "aca", "ada", "abr", "bra"] 

请随意更改 similar? 方法以匹配您对相似的定义。

关于ruby - 在允许与 Ruby 不匹配的情况下查找子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5322428/

相关文章:

ruby 正则表达式 : exclude apostrophe but include it if it's escaped

c - 实现我自己的 strstr() 函数时出现段错误

algorithm - 字符串模式匹配,后缀数组可以解决这个问题还是有更多的解决办法?

algorithm - 寻找最长的重复子串

java - 将字符串剪切到给定索引

algorithm - 从后缀数组制作LCP

javascript - 在客户端使用forgejs加密数据,并使用ruby解密

ruby-on-rails - rails中类属性的未定义方法错误

ruby - 使用 rackup 时找不到 Sinatra 静态 Assets

c# - 我将如何跳过 foreach 循环中的空格?