我已经创建了这个算法来计算最长的回文子序列(镜子时相同的词,即“aba”,“racecar”),并且使用递归的自上而下方法完成。我知道可以将这些转化为自下而上的迭代算法,但我很难看到如何实现这一点
我的代码
def palindrome(string, r = {})
return 1 if string.length == 1
return 2 if string[0] == string[1] and string.length == 2
return r[string] if r.include?(string)
n = string.length
if string[0] == string[n-1]
r[string] = palindrome(string[1..n-2],r) + 2
else
r[string] = [palindrome(string[0..n-2],r), palindrome(string[1..n-1],r)].max
end
end
答案 0 :(得分:0)
在从数组中提取项目时使用负数时,数组会从末尾开始计算元素,因此您不必保留{{1}变量
n
我不知道这是多么高效,但这是一个自上而下的建议:
if string[0] == string[-1] # <= same as string[n-1]
r[string] = palindrome(string[1..-2],r) + 2 # <= same as string[1..n-2]