Ruby on Rails中最长的回文

时间:2015-04-25 15:22:00

标签: ruby-on-rails ruby algorithm

编写一个接受小写字母字符串的方法(没有大写字母,没有重复)。考虑字符串的子串:字符串中包含的连续字母序列。 找到最长的字母串,这是一个回文。

基于本地方法Palindrome?(字符串),我使用测试用例实现了如下最长-palindrome(字符串):

def palindrome?(string)
  i = 0
  while i < string.length
    if string[i] != string[(string.length - 1) - i]
      return false
    end

    i += 1
  end

  return true
end

def longest_palindrome(string)
  dix = 0
  lstr = ""
  lstrc = nil
  while dix < string.length
    dix2 = 1
    while dix2 < string.length
      str = string.slice(dix,dix2)
      count = str.length
      if palindrome?(str)
        if lstrc == nil || lstrc < count
          lstr = str
          lstrc = count
        end
      end
      dix2 += 1
    end
    dix += 1
  end
  puts(lstr)
  return lstr
end

# These are tests to check that your code is working. After writing
# your solution, they should all print true.

puts(
  'longest_palindrome("abcbd") == "bcb": ' +
  (longest_palindrome('abcbd') == 'bcb').to_s
)
puts(
  'longest_palindrome("abba") == "abba": ' +
  (longest_palindrome('abba') == 'abba').to_s
)
puts(
  'longest_palindrome("abcbdeffe") == "effe": ' +
  (longest_palindrome('abcbdeffe') == 'effe').to_s
)

测试结果如下:

bcb                                                                                                                                                                                    
longest_palindrome("abcbd") == "bcb": true                                                                                                                                             
bb                                                                                                                                                                                     
longest_palindrome("abba") == "abba": false                                                                                                                                            
effe                                                                                                                                                                                   
longest_palindrome("abcbdeffe") == "effe": true  

为什么第二次测试失败了?

1 个答案:

答案 0 :(得分:1)

...这一行阻止你考虑整个字符串

while dix2 < string.length

因此当dix是整个字符串时,您没有对回文进行任何测试

将行更改为...

while dix2 <= string.length

如果你这样做,那实际上会更有效率......

while dix2 <= string.length - dix

哪会阻止您测试(例如,长度为10的字符串),string(7,3)string(7,4)以及string(7,5)等等,它们基本上都是相同的字符串。