Ruby检查字符串是否回文的方法

16
如何使用 Ruby 代码检查字符串是否为回文?
11个回答

51
如果您不熟悉Ruby的String方法,建议查看文档,非常好。Mithun的答案已经向您展示了基本原理,但由于您是Ruby的新手,还有一些需要注意的事项:
*) 如果您有一个谓词方法,惯例是在名称后面加上问号,例如palindrome?
*) 布尔表达式计算为布尔值,因此您不需要显式返回truefalse。 因此,一个简短的惯用版本将是:
def palindrome?(str)
  str == str.reverse
end

*) 由于Ruby的类是开放的,因此您可以将此添加到字符串类中:

class String
  def palindrome?
    self == self.reverse
  end
end

*) 如果您不想进行猴子补丁String,您可以直接在单个对象上定义该方法(或使用模块和Object#extend):

foo = "racecar"
def foo.palindrome?
  self == self.reverse
end

*) 你可能想让回文检查更加复杂,例如考虑大小写或空格,这样你就能够检测到回文句子,像"Racecar"这样的大写单词。

pal = "Never a foot too far, even."
class String
  def palindrome?
    letters = self.downcase.scan(/\w/)
    letters == letters.reverse
  end
end
pal.palindrome? #=> true

self.的使用是不必要的(但没有点的self的使用是必要的)。 - Dave Schweisguth
3
方法参数周围也要加上括号。编码风格就像口味一样,别人的都不好;-) - Michael Kohl
这不是非常昂贵吗?创建一个新数组来检查单词是否回文?我知道这是短代码,看起来很漂亮...但感觉很费事... - AFP_555
唯一创建数组的版本是最后一个,它实际上在过程中删除了标点符号,忽略了大小写等。但如果你真的很喜欢微调 SO 上的短代码片段,那就尽管去吧。 - Michael Kohl

17
def check_palindromic(variable)
  if variable.reverse == variable #Check if string same when reversed 
    puts "#{ variable } is a palindrome."
  else # If string is not the same when reversed
    puts "#{ variable } is not a palindrome."
  end
end

12

递归解决方案展示了如何在Ruby中索引字符串:

def palindrome?(string)
  if string.length == 1 || string.length == 0
    true
  else
    if string[0] == string[-1]
      palindrome?(string[1..-2])
    else
      false
    end
  end
end

如果你觉得阅读 Ruby 字符串文档太无聊,不妨尝试在 CodeQuizzes 上玩一下 Ruby 练习题,这样你就可以掌握大部分重要的方法。

它很厉害!线性时间复杂度 - StanisLove Sid

5
def is_palindrome(value)
 value.downcase!

 # Reverse the string
 reversed = ""
 count = value.length

 while count > 0
  count -= 1
  reversed += value[count]
 end
# Instead of writing codes for reverse string
# we can also use reverse ruby method
# something like this value == value.reverse  
if value == reversed
  return "#{value} is a palindrom"
 else
  return "#{value} is not a palindrom"
 end
end

puts "Enter a Word"
a = gets.chomp
p is_palindrome(a)

3
class String
  def palindrome?
    self.downcase == self.reverse.downcase
  end
end

puts "racecar".palindrome? # true
puts "Racecar".palindrome? # true 
puts "mississippi".palindrome? # false 

1

> first method
a= "malayalam"
  if a == a.reverse
    puts "a is true"
  else
    puts "false"
  end

> second one
a= "malayalam"
a=a.split("")
i=0
ans=[]
  a.count.times do
    i=i+1
      k=a[-(i)]
      ans << k
    end
  if a== ans
      puts "true"
  else
      puts "false"
  end


1
def palindrome?(string)
  string[0] == string[-1] && (string.length <= 2 || palindrome?(string[1..-2]))
end

2
请在代码中包含简要说明,并解释它如何解决问题。 - bad_coder

1
str= gets.chomp 
str_rev=""
n=1
while str.length >=n
    str_rev+=str[-n]
    n+=1
end

if str_rev==str
    puts "YES"
else
    puts "NO"
end

0
def palindrome?(str)
    return "Please pass the string" if str.nil?
    str = str.downcase
    str_array = str.split('')
    reverse_string = str_array.each_index{ |index| str_array[str_array.count - index - 1 ] end
    return ("String #{str} is not a palindrome") unless str == reverse_string.join('')

    "String #{str} is palindrome"
end

请不要发布仅包含代码的答案。未来的读者会感激您解释为什么这个答案回答了问题,而不是从代码中推断出来。此外,由于这是一个旧的、回答得很好的问题,请解释它如何补充所有其他答案。 - Gert Arnold

0

解决方案1:时间复杂度=O(n),空间复杂度=O(n)

该解决方案不使用String类的reverse方法,它使用一个栈(我们可以使用只允许从一端输入和输出元素的数组来模拟栈)。

def is_palindrome(str)
  stack = []
  reversed_str = ''
  str.each_char do |char|
    stack << char
  end
  
until stack.empty?
  reversed_str += stack.pop 
end

if reversed_str == str
  return true
 else
  return false
end
end
    
    

解决方案2:时间复杂度=O(n),空间复杂度=O(1)

 def inplace_reversal!(str)
   i =0
   j = str.length - 1
   while i < j
    temp = str[i]
    str[i] = str[j]
    str[j] = temp
    i+=1
    j-=1
   end
    return str
    end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接