Ruby最长的回文 - 为什么在while循环中稍作修改会破坏我的代码?

时间:2015-05-15 05:57:47

标签: ruby

我试图解决这个Ruby问题但我无法弄清楚为什么有一个小的while循环差异会导致一个测试错误:longest_palindrome(" abba")输出&#34 ; BB"而不是" abba",这是假的。我只能使用for和while循环解决它,所以请不要使用高级方法。更容易突出代码块中的差异(第一个是工作解决方案,第二个是我的。还假设已经定义了palindrome?方法):

def longest_palindrome(string)
best_palindrome = nil

  idx1 = 0

    ***while idx1 < string.length
    length = 1
    while (idx1 + length) <= string.length
      substring = string.slice(idx1, length)***

      if palindrome?(substring) && (best_palindrome == nil || substring.length > best_palindrome.length)
        best_palindrome = substring
      end

      length += 1
    end

    idx1 += 1
  end

  return best_palindrome
end


def longest_palindrome(string)
  longest = nil

  i = 0
  ***while i < string.length
    i2 = 1
    while i2 < string.length***
      if palindrome?(string.slice(i, i2)) == true && (longest == nil || string.slice(i, i2).length > longest.length)
        longest = string.slice(i, i2) 
      end
      i2 += 1
    end
    i += 1
  end

  return longest
end

1 个答案:

答案 0 :(得分:0)

这部分代码......

while i2 < string.length

...意味着你永远不会检查最大可能的长度。

"abba".slice(0,4)是整个字符串,但您只能前往"abba".slice(0,3),即“abb”。

所以你永远不会测试整个字符串。

将行更改为...

 while i2 <= string.length

......它应该没问题。