0

Rubyの文字列に似たプレフィックスの始まりの数を数えようとしています。例えば; 入力 "ababaa" は 11 を出力する必要があります。

ababaa = 6
 babaa = 0
  abaa = 3
   baa = 0
    aa = 1
     a = 1

以下のコードまでは、ネストされたループを使用して上記のそれぞれを配列として処理していますが、Ruby は現在、最初の配列オブジェクト「ababaa」のカウントのみを出力しているように見えます。

解決しました、ありがとう:)

def string_suffix(string)
num = 0
ary = []
string.length.times do
  ary << string[num..string.length]
  num = num + 1
end
result = 0
ary.each do |x| # ["ababaa", "babaa", "abaa", "baa", "aa", "a"] 
  x.chars.each_with_index do |c,index|
    break unless c == string[index]
      result = result + 1
  end
end
return result
end

私は遠くまで調べましたが、まだ問題を解決できません。「ary」配列の最初の反復後に (最終的な、ネストされた) 配列が壊れて、その出力を返すだけのようです。

4

3 に答える 3

0

最後に、2 番目のループ内で結果を返していることに気付きました。これは、配列の最初の項目を処理した後、関数は最初の項目の結果のみを返すことを意味します。return ステートメントをループの外に移動します。

于 2015-08-27T18:37:30.093 に答える
0

私が理解しているように、問題は次のとおりです。 string が与えられたs場合、 の対応する文字 (つまり、同じオフセット) と一致するi = 0..s.size-1の先頭文字の数を計算し、これらの小計を合計します。s[0..-i-1]s[i..-1]s.size

Enumerable#reduce (別名inject) とEnumerable#take_whileを使用して、これを行う Ruby のような方法を次に示します。

str = "ababaa"

arr = str.chars
(0...arr.size).reduce(0) do |tot,i|
  tot + arr[0..-i-1].zip(arr[i..-1]).take_while { |x,y| x == y }.size
end
  #=> 11

手順:

arr = str.chars
  #=> ["a", "b", "a", "b", "a", "a"] 
r = 0...arr.size
  #=> 0...6 

の最初の要素がrブロックに渡されると、ブロック変数は次のように設定されます。

tot = 0
i   = 0

したがって、ブロック計算は次のようになります。

a = arr[0..-i-1].zip(arr[i..-1])
  #=> arr[0..-1].zip(arr[0..-1])
  #=> arr.zip(arr)
  #=> ["a", "b", "a", "b", "a", "a"].zip(["a", "b", "a", "b", "a", "a"])
  #=> [["a", "a"], ["b", "b"], ["a", "a"], ["b", "b"], ["a", "a"], ["a", "a"]]

b = a.take_while { |x,y| x == y }
  #=> [["a", "a"], ["b", "b"], ["a", "a"], ["b", "b"], ["a", "a"], ["a", "a"]]

tot + b.size
  #=> 0 + 6
  #=> 6

この計算は、ブロックに渡されるarr.size最初の要素に対して常に等しいことに注意してください。arr

の次の要素がarrブロックに渡されると、ブロック変数iが に設定され1ます。tot計算したばかりの は、 に等しくなり6ます。したがって、ブロック計算は次のようになります。

a = arr[0..-i-1].zip(arr[i..-1])
  #=> arr[0..-2].zip(arr[1..-1])
  #=> ["a", "b", "a", "b", "a"].zip(["b", "a", "b", "a", "a"])
  #=> [["a", "b"], ["b", "a"], ["a", "b"], ["b", "a"], ["a", "a"]] 

b = a.take_while { |x,y| x == y }
  #=> [] 
tot + b.size
  #=> 6 + 0
  #=> 6

残りの計算は同様です。のすべての要素がarrブロックに送信された後reduce、 の値を返しますtot

于 2015-08-30T23:14:34.937 に答える