代码之家  ›  专栏  ›  技术社区  ›  iswg

Ruby最长回文

  •  1
  • iswg  · 技术社区  · 9 年前

    答案:

    假设字符串有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”、“a”、“r”)的数组时,为什么ana会为零,所以这不应该在ana中吗?

    1 回复  |  直到 9 年前
        1
  •  3
  •   user94559    9 年前

    每次运行此代码时:

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

    ana 获取新值。 detect 将返回第一个回文元素或 nil 所以在这种情况下 n 是没有回文的长度, 安娜 .

    return ana.join if ana
    

    表示“如果 安娜 为true(例如非零),返回 ana.join “。在您修改的代码中,有时 安娜 ,而你试图 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
    

    正如你所见, 安娜 直到你穿7号。