2016-07-17 35 views
1

我試圖解決在Ruby中最長的迴文的問題,我發現在計算器的答案:紅寶石最長的迴文

答:

假設字符串中有n個字符。首先看看整個字符串是否是迴文。如果是,則返回字符串。菲尼!如果不是,請查看長度爲n-1的兩個子串中的任何一個是否是迴文。如果有,返回。如果不是,則檢查長度爲n-2的子字符串,依此類推。只要字符串至少包含一個字母,就可以找到最長的迴文。

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) 

但我不明白爲什麼會全日空是nil當我發現符合這將是[條件」的第一個數組r「,」a「,」c「,」e「,」c「,」a「,」r「],所以不應該在ana中?

回答

3

每個這段代碼運行時間:

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

ana得到一個新的價值。 detect將返回第一個是迴文的元素或nil。所以在n是沒有迴文的長度的情況下,ana將是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') 

輸出:

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

正如你所看到的,ananil,直到你的威風7。