2016-07-17 3 views
1

私はRubyで最長の回文の問題を解決しようとしている、と私はstackoverflowの上で答えを見つけました:ルビー最長の回文

ANSWER:

が文字列のn文字を持っていると仮定します。まず文字列全体が回文かどうかを確認します。そうであれば、文字列を返します。フィニ!そうでない場合、長さn-1の2つの部分文字列のいずれかが回文文字列かどうかを確認します。もしそうなら、それを返す。そうでない場合は、長さn-2の部分文字列などを調べます。文字列に少なくとも1文字が含まれている限り、最も長い回文が見つかります。

def longest_palindrome(str) 
    arr = str.downcase.chars 
    str.length.downto(1) do |n| 
    ana = arr.each_cons(n).detect { |b| b == b.reverse } 
    return ana.join if ana 
    end 
end 

puts longest_palindrome "ilikeracecar" 

しかし、私はトラブルこの行を理解を持っている:

return ana.join if ana 

if ana 

は何を意味するのでしょうか?

また、なぜこれは機能しませんか?

def longest_palindrome(str) 
    arr = str.downcase.chars 
    str.length.downto(1) do |n| 
    ana = arr.each_cons(n).detect { |b| b == b.reverse } 
    return ana.join 
    end 
end 

「[私はこれを実行すると、それは私に

undefined method `join' for nil:NilClass (NoMethodError) 

を与えるしかし、私は次のようになり条件を満たしている最初の配列を検出してきた際にANAがnilになる理由を私は理解していませんr、a、c、e、c、a、rなど]これはアナではないはずですか?

答えて

3

このコードを実行するたび:

ana = arr.each_cons(n).detect { |b| b == b.reverse } 

anaは、新しい値を取得します。 detectは、パリンドロームである最初の要素、またはnilを返します。したがって、nが回文が存在しないような長さである場合、はnilとなる。

return ana.join if ana 

"anaが真である場合(例えば、非ゼロ)、ana.joinを返す" を意味します。あなたの変更されたコードでは、ときどきananilであり、とにかくjoinにしようとします。

それはあなたには、いくつかのログを追加した場合、コードを理解しやすいかもしれません:

def longest_palindrome(str) 
    arr = str.downcase.chars 
    str.length.downto(1) do |n| 
    puts "n = #{n}" 
    ana = arr.each_cons(n).detect { |b| b == b.reverse } 
    if ana == nil then 
     puts "ana is nil" 
    else 
     puts "ana = #{ana.join}" 
    end 
    return ana.join if ana 
    end 
end 

puts longest_palindrome('a racecar') 

出力:あなたはサイズ7に取り掛かるまで

n = 9 
ana is nil 
n = 8 
ana is nil 
n = 7 
ana = racecar 
racecar 

あなたが見ることができるように、ananilです。