我应该返回给定字符串中最大回文的大小。例如,如果我通过"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
我从这里开始的思考过程是将字符串拆分成较小的块,可能是通过循环。任何帮助或指导将不胜感激。
答案 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”这个词,意思是敲门。