1

文字列の配列があるとしましょう:

["carflam fizz peanut butter", "fizz foo", "carflam foo peanut butter"]

function get_array_of_substrings_larger_than(min), with , の出力は、少なくとも 2 つの文字列がそれぞれの要素を共有しているためget_array_of_substrings_larger_than(3)、 となるはずです。["peanut butter", "carflam", "fizz"]

これの書き方がいまいちわかりません。すべての文字列を他の文字列と単純に比較して最大の部分文字列を取得するのと同じではないことに注意してください。上記の例では、carflam が常に 2 番目に大きい部分文字列になります。

"peanut butter"と を比較する"carflam fizz peanut butter""carflam foo peanut butter"、最大の共通部分文字列は であるため、一緒です"peanut butter"。2 番目に大きい部分文字列はであり"carflam"、どちらも独立して出力に含まれる必要がありますが、どちらもより大きな部分文字列に含まれているため、出力には含ま"peanut""butter"ません。

助けてくれてありがとう

4

4 に答える 4

1

まず第一に、あなたが何を求めているかを明確にすることが最大のフレーズだと思います。より良い言葉がないからです。この例の配列で見られる最大の部分文字列は、実際には"carflam f"" peanut butter"です。aryまた、使用しているクラスで既知の量である場合は、自由に引数を変更してください。

def get_array_of_phrases_larger_than(ary, min)
  all = []

  # Ugly, but this will span the range of possible phrases for each item in the
  # array, building them into a one-dimensional array if they meet the minimum
  # length requirements
  ary.each do |phrase|
    words = phrase.split
    last = words.length - 1
    (0..last).each do |from|
      (from..last).each do |to|
        p = words[from..to].join(" ")
        all << p if p.size > min
      end
    end
  end

  # Get a list of all repeated keys
  repeated = all.group_by(&:to_s).select { |_, v| v.size > 1 }
  keys = repeated.keys

  # Get a list of the longest keys, such that we exclude "peanut" and "butter"
  # if "peanut butter" exists
  longest = repeated.select do |key, _|
    keys.select { |k| k.include?(key) }.size == 1
  end

  # Sort in reverse order by length
  longest.keys.sort_by { |k| -k.size }
end

@ary = ["carflam fizz peanut butter", "fizz foo", "carflam foo peanut butter"]

get_array_of_phrases_larger_than @ary, 3
# => ["peanut butter", "carflam", "fizz"]

["butter butter", "foo", "baz"]これは文字列がどこから来たのかにとらわれないため、 returnのようなもので誤検知が発生する可能性があることに注意してください["butter"]

于 2013-04-06T09:23:40.373 に答える
0

ここから始める:

    a = ["carflam fizz peanut butter", "fizz foo", "carflam foo peanut butter"]

    phrases = {}

    index = 0;
    a.each do |s|
      words = s.split(' ')
      len = words.length
      (1..len).each do |phrase_len|
        (0..(len-phrase_len)).each do |start_word|
          if start_word >= 0
            phrase = words[start_word, phrase_len].join(' ')
            if phrases[phrase].nil?
              phrases[phrase] = []
            end
            phrases[phrase] << "(#{index}) #{s}";
          end
        end
      end
      index = index + 1;
    end

    phrases.each_pair do |phrase, indexes|
      puts "found *#{phrase}* of #{indexes.size} elements"
    end

これにより、これが発生した場所でフレーズからインデックスへのマップが得られます。これをあなたが望むようにすることができると確信しています〜

于 2013-04-06T09:13:07.827 に答える
0

3より長く、2つの文字列にあるためget_array_of_substrings_larger_than(3)、出力する必要はありませんか?fizz

これを解決するには、文字列をペアごとに比較して、最長の共通サブシーケンスを見つけることができます: http://en.wikipedia.org/wiki/Longest_common_subsequence_problem

2 番目に長い共通サブシーケンスを見つけるには、文字列から最長の共通サブシーケンスを削除できます。したがって、見つかった場合peanut butter、比較する新しい文字列は"carflam fizz""carflam foo"です。

于 2013-04-06T08:44:48.310 に答える