寻找最长的回文(红宝石)

时间:2018-01-13 19:09:08

标签: ruby

我遇到以下代码时遇到问题。我需要找到最长的回文,但我的方法一直输出为零。我想最好用范围功能来解决这个问题......对于我做得不对的任何帮助和解释都非常感谢...欢呼。

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

3 个答案:

答案 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"

将找到回文因为每个单字符串都是一个。

请参阅Enumerable#each_cons

顺便说一下,&#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

虽然这不是最有效的方法,但我认为这更像红宝石。 你可以通过小写,剥离空格等改进回文检测。