Ruby 你知道在 Ruby 中如何查看 String 是否是回文?

mehdi-farsi · 2020年09月09日 · 最后由 levi0214 回复于 2020年10月02日 · 2186 次阅读

这是一个测试文件 👇👇👇👇👇👇👇

class String
  def palindrome?
    # ...
  end
end

"madam".palindrome?     # => true
"racecar".palindrome?   # => true
"madam, . ".palindrome? # => true

"02/02/2020".palindrome?     # => true
"11/11/11 11:11".palindrome? # => true

"Madam, I'm Adam".palindrome?                 # => true
"A man, a plan, a canal – Panama".palindrome? # => true

大家都来说下自己的💡💡想法💡💡,分享到下方的回复中

这是我的版本,欢迎大家指教👉👉👉https://gist.github.com/mehdi-farsi/2729f421c0d408552cf22adab45a0ca8

class String
  def palindrome?
    mid_index = self.size/2
    mid_index.times do |i|
      return false if self[i]!=self[self.size-1-i]
    end
    true
  end
end

p "1234321".palindrome? # true
p "123321".palindrome? # true
p "122321".palindrome? # false
p "223321".palindrome? # false

你要的是那种安全审查系统,比如阿里云 Green

huacnlee 回复

我是想和大家一起探讨下对回文的想法,并分享自己的见解。

luxious 回复

轴对称,非常棒的方式。但是不全面,例如"A man, a plan, a canal – Panama".palindrome?就是个例子 请看下我的方式,https://gist.github.com/mehdi-farsi/2729f421c0d408552cf22adab45a0ca8feel,当然你还有别的方式,也请 free 留言,谢谢。

你说的 String 是否是回文,是说它这个 String 中包含了回文的字符串,而不仅仅是这个 String 本身就是一个回文字符串?

liuminhan 回复

String 本身就是一个回文字符串,可以包含标点,空格。 例如"A man, a plan, a canal – Panama" 反过来就是👉👉👉“Amanap lanac a nalP a nam a”

luxious 回复
class String
  def palindrome?
    self.reverse == self                                                             
  end
end

p "1234321".palindrome? # true
p "123321".palindrome? # true
p "122321".palindrome? # false
p "223321".palindrome? # false

sevk 回复

我一直用的是這個辦法😂

sevk 回复
class String
  def palindrome?
    self.reverse == self                                                             
  end
end

p "1234321".palindrome? # true
p "123321".palindrome? # true
p "122321".palindrome? # false
p "223321".palindrome? # false
p "11/11/11 11:11".palindrome? # false. 应该是true
p "A man, a plan, a canal – Panama".palindrome? # false. 应该是true

也可以用 manacher 算法提升效率

mehdi-farsi 回复
class String
  def palindrome?
    a=self.gsub(/[^\w]/,'').upcase
    a.reverse == a                                                                   
  end
end

p "1234321".palindrome? # true
p "123321".palindrome? # true
p "122321".palindrome? # false
p "223321".palindrome? # false
p "11/11/11 11:11".palindrome? # false. 应该是true
p "A man, a plan, a canal – Panama".palindrome? # false. 应该是true

sevk 回复

给力!

Michael Hartl 在去年的 RubyConf 上以这个例子做过分享

class String
  def palindrome?
    return false if empty?
    letters = scan(/[a-zA-Z0-9]/).join.downcase
    letters == letters.reverse                                 
  end
end
需要 登录 后方可回复, 如果你还没有账号请 注册新账号