【发布时间】:2011-04-29 07:22:06
【问题描述】:
给定两个长度相等的字符串
s1 = "ACCT"
s2 = "ATCT"
我想找出字符串不同的位置。所以我做了这个。 (请提出更好的方法。我打赌应该有)
z= seq1.chars.zip(seq2.chars).each_with_index.map{|(s1,s2),index| index+1 if s1!=s2}.compact
z 是两个字符串不同的位置数组。在这种情况下 z 返回 2
假设我添加了一个新字符串
s3 = "AGCT"
我希望将它与其他字符串进行比较,看看 3 个字符串的不同之处。我们可以采用与上述相同的方法,但这次
s1.chars.zip(s2.chars,s3.chars)
返回一个数组数组。给定两个字符串,我只是在比较两个字符是否相等,但是当我添加更多字符串时,它开始变得不堪重负,并且随着字符串变得更长。
#=> [["A", "A", "A"], ["C", "T", "G"], ["C", "C", "C"], ["T", "T", "T"]]
跑步
s1.chars.zip(s2.chars,s3.chars).each_with_index.map{|item| item.uniq}
#=> [["A"], ["C", "T", "G"], ["C"], ["T"]]
可以帮助减少冗余并返回完全相同的位置(大小为 1 的非空子数组)。然后我可以打印出大小 > 1 的子数组的索引和内容。
s1.chars.zip(s2.chars,s3.chars,s4.chars).each_with_index.map{|item| item.uniq}.each_with_index.map{|a,index| [index+1,a] unless a.size== 1}.compact.map{|h| Hash[*h]}
#=> [{2=>["C", "T", "G"]}]
我觉得随着字符串数量的增加和字符串长度的增加,它会停止或变慢。有哪些最佳方法可以做到这一点? 谢谢你。
【问题讨论】:
-
你可能想看看通用 diff 算法:en.wikipedia.org/wiki/Diff#Algorithm