字符串中最长的回文

时间:2016-02-23 06:11:46

标签: ruby

我应该返回给定字符串中最大回文的大小。例如,如果我通过"racecar",我应该返回7。如果我通过"racecarveryfast""veryfastracecar",它仍应返回7。我必须传递的规格是:

Test.assert_equals(longest_palindrome("a"), 1)
Test.assert_equals(longest_palindrome("aa"), 2)
Test.assert_equals(longest_palindrome("baa"), 2)
Test.assert_equals(longest_palindrome("aab"), 2)
Test.assert_equals(longest_palindrome("baabcd"), 4)
Test.assert_equals(longest_palindrome("baablkj12345432133d"), 9)

我正在使用此代码传递前四个:

def longest_palindrome s
  sub_count = 0

  palidrome_count = []
  s_array = s.chars

  puts "string: " + s
  puts "string array: " + s_array.to_s

  if s.reverse == s
    return s.size
  else
    s.match('(.)\1')[0].size
  end
end

我从这里开始的思考过程是将字符串拆分成较小的块,可能是通过循环。任何帮助或指导将不胜感激。

2 个答案:

答案 0 :(得分:2)

def longest_palindrome(string)
  i = 0
  a = []
  while !string[i..-1].empty?
     j = -1
   while !string[i..j].empty?
     s = string[i..j]
     if s.reverse == s
       a << s.length
     end
    j -= 1
   end
   i += 1
 end
  a.max
end

答案 1 :(得分:2)

假设字符串有n个字符。首先看看整个弦是否是回文。如果是,返回字符串。菲尼!如果不是,请查看长度为n-1的两个子串中的任何一个是否为回文。如果是,请将其归还。如果没有,请检查长度为n-2的子字符串,依此类推。只要该字符串包含至少一个字母,就会找到最长的回文。

def longest_palindrome(str)
  arr = str.downcase.chars
  str.length.downto(1) do |n|
    ana = arr.each_cons(n).find { |b| b == b.reverse }
    return ana.join if ana
  end
end

此处的关键方法是Enumerable#each_cons

以下是一些例子 1

longest_palindrome "a"                     #=> "a" 
longest_palindrome "aa"                    #=> "aa" 
longest_palindrome "baa"                   #=> "aa" 
longest_palindrome "aab"                   #=> "aa" 
longest_palindrome "baabcd"                #=> "baab" 
longest_palindrome "baablkj12345432133d"   #=> "123454321" 
longest_palindrome "I heard tattarrattats" #=> "tattarrattat"

1詹姆斯·乔伊斯在尤利西斯中创造了“tattarrattat”这个词,意思是敲门。