当前位置:  开发笔记 > 后端 > 正文

如何优雅地计算红宝石中单词的anagram签名?

如何解决《如何优雅地计算红宝石中单词的anagram签名?》经验,为你挑选了2个好方法。

出于这个问题,我正在寻找一种优雅(红宝石)的方式来计算这个答案中建议的单词签名.

建议的想法是对单词中的字母进行排序,并运行长度编码重复的字母.因此,例如"mississippi"首先变成"iiiimppssss",然后可以通过编码为"4impp4s"进一步缩短.

我对红宝石相对较新,虽然我可以一起破解,但我确信这对于有红宝石经验的人来说是一个单一的衬垫.我有兴趣看到人们的方法,并提高我的红宝石知识.

编辑:澄清一下,计算签名的性能对我的应用来说并不重要.我在找计算签名,所以我可以用它的每个字在一个大数据库中的单词的存储(450K的话),然后查询这些具有相同的签名(即给定单词的所有字谜的话,那是真实的英语单词).因此关注空间."优雅"部分只是为了满足我的好奇心.



1> martinus..:

创建字母排序列表的最快方法是:

"mississippi".unpack("c*").sort.pack("c*")

它比split('')和join()快得多.为了进行比较,最好将数组一起打包成一个String,这样你就不必比较数组了.



2> Robert Simmo..:

我没有太大的红宝石人任,但正如我在另评论指出,这似乎为所描述的算法工作.

s = "mississippi"
s.split('').sort.join.gsub(/(.)\1{2,}/) { |s| s.length.to_s + s[0,1] } 

当然,您需要确保单词为小写,不包含数字等.

根据要求,我将尝试解释代码.请原谅我,如果我没有得到所有的红宝石或前章术语是正确的,但在这里不用.

我认为分割/排序/连接部分非常简单.对我来说有趣的部分始于对gsub的调用.这将替换与正则表达式匹配的子字符串以及其后面的块的返回值.reg ex找到任何字符并创建反向引用.这就是"(.)"部分.然后,我们使用反向引用"\ 1"继续匹配过程,该反向引用评估匹配的第一部分找到的任何字符.我们希望找到该字符至少两次,总的最小出现次数为3次.这是使用量词"{2,}"完成的.

如果找到匹配项,则匹配的子字符串将作为参数传递给下一个代码块,这要归功于"| s |" 部分.最后,我们使用相当于匹配子字符串长度的字符串,并将其附加到该字符串组成的任何字符(它们应该都是相同的)并返回连接值.返回的值将替换原始匹配的子字符串.整个过程一直持续到没有任何东西要匹配,因为它是原始字符串的全局替换.

如果那令人困惑,我道歉.通常情况下,我更容易想象解决方案而不是清楚地解释它.

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有