我遇到以下代码时遇到问题。我需要找到最长的回文,但我的方法一直输出为零。我想最好用范围功能来解决这个问题......对于我做得不对的任何帮助和解释都非常感谢...欢呼。
def palindrome?(string)
idx = 0
while idx < string.length
if string[idx] != string[(string.length-1)-idx]
return false
end
idx+=1
end
return true
end
def longest_palindrome(string)
longestlength = nil
longestpalindrome = nil
idx2 = 0
while idx2 < (string.length-1)
idx3 = idx2+1
longpalindrome = string[idx2..idx3]
longlength = longpalindrome.length
while idx3 < longlength
if palindrome?(longpalindrome) == true && (longlength > longestlength.to_i || longestlength == nil)
longestlength = longlength
longestpalindrome = longpalindrome
end
idx3 += 1
end
idx2 +=1
end
return longestpalindrome
end
答案 0 :(得分:1)
这是一种更像Ruby的方式来解决你的问题。
def longest_palindrome(str)
return "" if str.empty?
arr = str.chars
arr.size.downto(1) { |n| arr.each_cons(n) { |a| return a.join if a == a.reverse } }
end
longest_palindrome "rattattarrattatly"
#=> "tattarrattat"
将找到回文因为每个单字符串都是一个。
顺便说一下,&#34; tattarrattat&#34;是longest palindromic word in the Oxford English Dictionary。它是詹姆斯·乔伊斯在尤利西斯创造的,意思是敲门声。
答案 1 :(得分:0)
无论如何,谢谢大家。我想到了。我不得不更新其中一个比较并转移到下面:
longpalindrome = string[idx2..idx3]
longlength = longpalindrome.length
下的
while idx3 < string.length
以下是正确的代码:
def palindrome?(string)
idx = 0
while idx < string.length
if string[idx] != string[(string.length-1)-idx]
return false
end
idx+=1
end
return true
end
def longest_palindrome(string)
longestlength = nil
longestpalindrome = nil
idx2 = 0
while idx2 < (string.length-1)
idx3 = idx2+1
while idx3 < string.length
longpalindrome = string[idx2..idx3]
longlength = longpalindrome.length
if palindrome?(longpalindrome) == true && (longlength > longestlength.to_i || longestlength == nil)
longestlength = longlength
longestpalindrome = longpalindrome
end
idx3 += 1
end
idx2 +=1
end
return longestpalindrome
end
在我的原始代码中,我在while
之前声明了字符串while idx3 < string.length
循环,所以在迭代期间,字符串没有更新。无论如何,感谢你的帮助。
答案 2 :(得分:0)
一个更红宝石的方法,恕我直言:
words = [...]
palindromes = words.select { |word| word == word.reverse }
longest_palindrome = palindromes.sort.last
虽然这不是最有效的方法,但我认为这更像红宝石。 你可以通过小写,剥离空格等改进回文检测。