2013-09-04 1 views
-2

T9 트라이 발생기를 구현하면 큰 결함이 있습니다. 트리에 추가하는 것보다 트리에 추가 된 이전 단어를 덮어 쓰는 것입니다.Ruby에서 T9 Trie를 수정하여 새 단어 추가

t = Trie.new 
t.build('buy') 
t.build('build') 
t.build('builder') 
t.build('act') 
t.build('acu') 
puts t.inspect 

출력이 : 난 그냥 ... 난처한 상황에 빠진, 그것을

class Trie 
    def initialize 
    @root = Hash.new 
    end 

# do a for loop here 
    def build(word) 
    node = @root 
    t9num = word.tr('a-z', '22233344455566677778889999') 
    t9num.each_char do |ch| 
     node[ch] ||= Hash.new 
     node = node[ch] 
    end 
    node[:end] = "#{word}" 
    end 

    def find(str) 
    node = @root 
    str.each_char do |ch| 
     return nil unless node = node[ch] 
    end 
    node[:end] && true 
    end 
end 

이 명령을 놀라게하고 있지 않다

#<Trie:0x0000010103ea60 @root={"2"=>{"8"=>{"9"=>{:end=>"buy"}, "4"=>{"5"=>{"3"=>{:end=>"build", "3"=>{"7"=>{:end=>"builder"}}}}}}, "2"=>{"8"=>{:end=>"acu"}}}}> 
+0

샘플 입력 해시와 출력 간의 관계를 설명 할 수 있습니까? 샘플 출력이 샘플 입력과 실제로 연결되는지 또는 단지 다른 예제인지는 알 수 없습니다. –

+0

안녕 저스틴 - 샘플 출력은 숫자 426의 입력과 함께 갈 것입니다. 원하는 출력은 숫자와 해시에서 나타내는 단어 목록을 모두 포함합니다. 트라이에 해시를 공급할 수 있는지 여부는 알 수 없습니다. – tremstat

답변

0

이 문제가이에 나에게 보인다 줄 :

node[:end] = "#{word}" 

여기에 node[:end]은 한 단어 일 수 있으며 두 단어가 동일한 t9 키 시퀀스를 갖는 경우 덮어 씁니다. 대신 다음을 시도하십시오.

(node[:end] ||= []) << word 

이렇게하면 지점의 끝에 단어 배열이 생깁니다. 단어가 이미 trie에 있는지 확인하는 것을 잊지 마십시오.

관련 문제