【发布时间】:2012-01-06 02:29:54
【问题描述】:
假设我有一本名称字典(一个巨大的 CSV 文件)。我想从一封没有明显可解析点(.、-、_)的电子邮件中猜测一个名称。我想做这样的事情:
dict = ["sam", "joe", "john", "parker", "jane", "smith", "doe"]
word = "johnsmith"
x = 0
y = word.length-1
name_array = []
for i in x..y
match_me = word[x..i]
dict.each do |name|
if match_me == name
name_array << name
end
end
end
name_array
# => ["john"]
不错,但我想要“John Smith”或 ["john", "smith"]
换句话说,我递归地遍历单词(即未解析的电子邮件字符串“johndoe@gmail.com”),直到在字典中找到匹配项。 我知道:这非常低效。如果有更简单的方法可以做到这一点,我会全力以赴!
如果没有更好的方法,那么请告诉我如何修复上面的示例,因为它存在两个主要缺陷:(1)我如何设置循环的长度(请参阅查找“i”的问题下面),以及(2)如何在上面的示例中增加“x”,以便我可以循环遍历给定任意字符串的所有可能的字符组合?
寻找循环长度的问题,“i”:
for an arbitrary word, how can we derive "i" given the pattern below?
for a (i = 1)
a
for ab (i = 3)
a
ab
b
for abc (i = 6)
a
ab
abc
b
bc
c
for abcd (i = 10)
a
ab
abc
abcd
b
bc
bcd
c
cd
d
for abcde (i = 15)
a
ab
abc
abcd
abcde
b
bc
bcd
bcde
c
cd
cde
d
de
e
【问题讨论】:
-
进一步研究表明,“i”可以使用一系列三角数推导出来:a(n) = C(n+1,2) = n(n+1)/2 = 0+ 1+2+...+n。 oeis.org/…
标签: ruby-on-rails ruby loops pattern-matching email-validation