Вот где я бы начал с такого рода задач; Это отличные строительные блоки для человеческих интерфейсов в Интернете или в приложениях:
require 'regexp_trie'
saxophone_section = ["alto 1", "alto 2", "tenor 1", "tenor 2", "bari sax"]
RegexpTrie.union saxophone_section # => /(?:alto\ [12]|tenor\ [12]|bari\ sax)/
Вывод RegexpTrie.union
- это шаблон, который будет соответствовать всем строкам в saxophone_section
. Шаблон является лаконичным и эффективным, и, что лучше всего, его не нужно генерировать вручную.
Применение этого шаблона к создаваемой строке покажет, есть ли у вас попадание при совпадении, но только когда строки достаточно для совпадения.
Вот где обычный Tr ie очень полезен. Когда вы пытаетесь найти возможные удары, которые вы могли бы получить, до полного матча Tr ie может найти все возможности:
require 'trie'
trie = Trie.new
saxophone_section = ["alto 1", "alto 2", "tenor 1", "tenor 2", "bari sax"]
saxophone_section.each { |w| trie.add(w) }
trie.children('a') # => ["alto 1", "alto 2"]
trie.children('alto') # => ["alto 1", "alto 2"]
trie.children('alto 2') # => ["alto 2"]
trie.children('bari') # => ["bari sax"]
Смешайте их вместе и посмотрите, что вы придумали с.