2017-01-07 5 views
2

argとして最小の長さを与えられた特定の文字列の可能なすべての連続する単語の組み合わせを生成したい。文字列の可能なすべての連続した単語の組み合わせを生成する

「hello」と言うと、結果は(hello、hello、hello、helloの3つの長さが与えられます)。私はこれを達成しました

一つの方法は、ある経由:

def get_all_word_combinations(str, min_length) 
    chars = str.split('') 
    all_results = [] 

    (min_length..str.size).each do |x| 
     chars.each_cons(x) do |r| 
     all_results << r.join 
     end 
    end 
    return all_results 
    end 

しかし、これは大きな言葉でうまくいくかどうかわかりません。

+0

@Carcigenicate申し訳ありませんが問題の正しさについての質問が多かったです。それを編集しました。 – anemaria20

+0

質問をひっくり返してください:なぜ*大きな単語では機能しませんか?コード内の単語の長さに依存するものは何ですか?つまり、要件は明確ではありません。 "hel"と "leh"は区別されますか? –

+0

ここであまり間違って見ることはできません...おそらく 'get_all_word_slices'はより良い名前です。 – steenslag

答えて

1

このソリューションは不要joinsを避ける:

word  = "hello" 
size  = word.size 
min_size = 3 

(min_size..size).flat_map { |l| (0..size - l).map { |i| word[i, l] } } 
#=> ["hel", "ell", "llo", "hell", "ello", "hello"] 

あなたは配列を必要とするが、ちょうどあらゆる可能な部分文字列を反復処理する必要がない場合は、このソリューションは、より少ないメモリを使用します。

(min_size..size).each do |l| 
    (0..size - l).each do |i| 
    # do something with word[i, l] 
    end 
end 
+0

'word =" aaaa "; size = word.size; min_size = 2; (min_size..size).flat_map {| l | (0..size-1).map {| i |あなたは '.uniq'をタックすることをお勧めします。[。 –

+0

@CarySwoveland:ArrayのサイズとOPの意図に本当に依存していると思います。巨大な配列でuniqを使っていくつかの部分文字列を取り除くことは価値がないかもしれません。 'each 'を2回使用する方が良いアイデアかもしれません。 –

+0

1つの選択肢は、質問を文字通り解釈することです。「特定の文字列のすべての連続した単語の組み合わせを生成したい...」 :-) –

関連する問題