红宝石最长的回文

时间:2016-07-17 02:54:41

标签: ruby palindrome enumerable longest-substring

我正在尝试解决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”]所以不应该这样吗?

1 个答案:

答案 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”。在修改后的代码中,有时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级。