2016-07-17 32 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。