我正在尝试开发一个函数,它将返回输入字符串的最长回文子字符串。我现在正在努力分解字符串,以便然后可以分析每个子部分以查看它是否是回文代码如下:
def longest_palindrome(s)
place = 0
array = s.chars
output = []
while place < s.length
output << (array[0]..array[place]).to_a
place += 1
end
return output
end
如果给定字符串“ababa”,我希望结果数组看起来像这样:
[["a"],["a","b"],["a","b","a"],["a","b","a","b"],["a","b","a","b","a"]]
但是,当我返回输出数组时,这是存储在其中的内容:
[["a"], ["a", "b"], ["a"], ["a", "b"], ["a"], ["a", "b"]]
我的功能如何导致这种情况发生?
编辑:
不确定我是否应该为此开始另一个话题。我的代码现在如下:
def longest_palindrome(s)
array = s.chars
start = 0
place = 1
output = []
while start < s.length - 1
while place < s.length
output << array[start..place]
place += 1
end
start += 1
end
return output
end
我的逻辑是,这将从索引0开始,然后逐渐捕获字符串中的一个字符,直到整个字符串完成。然后它将从索引1开始并执行相同的操作,直到它获得字符串中的所有可能的子串。但是,它只返回:
[["a"],["a","b"],["a","b","a"],["a","b","a","b"],["a","b","a","b","a"]]
我逻辑中的缺陷在哪里?
答案 0 :(得分:3)
您误用范围运算符来生成'a'..'a'
等范围,这只是'a'
。
您有两个完全独立的数组索引操作,每个操作都返回一个元素(字符),以便在一个范围内使用。您获得的array[0]
始终为a
,而array[place]
会在a
和b
之间切换,并生成范围'a'..'a'
和'a'..'b'
一遍又一遍,这与字符最初来自的数组无关。
在从数组中提取元素之后,您无法构建范围,并期望从数组生成范围。通过使用范围作为数组的索引来生成正确的子数组:array[0..place]
。这会将子数组从0
返回到place
,包括在内。