我正在尝试解决Ruby中最长的回文问题,我在stackoverflow上找到了答案:
解答:
假设字符串有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)
但我不明白为什么当我检测到第一个符合[“r”,“a”,“c”,“e”,“c”条件的数组时,ana会为nil, “a”,“r”]所以不应该这样吗?
答案 0 :(得分: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
”。在修改后的代码中,有时ana
为nil
,无论如何您都尝试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
如您所见,ana
为nil
,直到您达到7级。