我知道这个问题已经被问过很多次了,但是我的问题有点不同。这个任务要求我不验证一个字符串是否是回文——而是验证一个字符串中有多少回文(返回为“int”)。这应该使用迭代函数来完成
以下是我的迭代函数代码供参考:
def iterativePalindrome(str, n):
allPalindromes = [[0 for x in range(n)] for y in range(n)]
verify = [[False for x in range(n)] for y in range(n)]
for i in range(n):
verify[i][i] = True
for i in range(n - 1):
if (str[i] == str[i + 1]):
verify[i][i + 1] = True
allPalindromes[i][i + 1] = 1
for iterativeGap in range(2, n):
for start in range(n - iterativeGap):
end = iterativeGap + start;
if (str[start] == str[end] and verify[start + 1][end - 1]):
verify[start][end] = True
if (verify[start][end] == True):
allPalindromes[start][end] = (allPalindromes[start][end - 1] + allPalindromes[start + 1][end] + 1 - allPalindromes[start + 1][end - 1])
else:
allPalindromes[start][end] = (allPalindromes[start][end - 1] + allPalindromes[start + 1][end] - allPalindromes[start + 1][end - 1])
return allPalindromes[0][n - 1]
我只是很难把它转换成递归函数。感谢所有帮助!
我有一个递归的解决方案,但它再次计算一些值,这可以通过动态编程(记忆化)来克服。如有任何建议,将不胜感激。下面是递归的伪代码。
Check whether the string from 'start' index to 'end' index is a palindrome if yes -> inc. the answer and then
recursively check for other strings by removing first and last character from the current string
import numpy as np
#initializing dp array with zeros
dp = np.zeros(shape = (len(st) , len(st))
def CountPalindromes(st , start, end):
if(dp[start][end] == 1): return 0
flag = checkIfTheStringIsPalindrome(st , start, end)
ans = 0
if(flag): ans = 1
dp[start][end] = 1
if(start < end):
return ans + CountPalindromes(st , start, end-1) + CountPalindromes(st , start+1 , end)
else: return ans
answer = CountPalindromes(st , 0 , len(st)-1)
print(answer)
在上面的代码中,许多字符串将被重新检查,这将增加计数。为了解决这个问题,dp数组用于跟踪已经计算的子问题
我想我成功了!看看我的递归实现,它可以在字符串中找到所有回文,在我看来,这并不是解决它的最干净的方法(任何让它更简单的建议都会受到欢迎),请随意询问您不清楚的问题:
found = []
def count_palindrome(m_str, start, end, orig_len):
if len(m_str)<2:
return
elif m_str == m_str[::-1]:
if (start, end) not in found:
found.append((start, end))
if len(m_str)<orig_len:
return
counter = count_palindrome(m_str[:-1], start, end-1, orig_len)
counter = count_palindrome(m_str[1:], start+1, end, orig_len)
str_to_work_on = "acac"
count_palindrome(str_to_work_on, 0, len(str_to_work_on), len(str_to_work_on))
for indices in found:
print(str_to_work_on[indices[0]:indices[1]])
输出:
aca
cac
# I tried it on more complex examples as well and it seems to work fine for my eyes,
# try to challenge it by giving extra complex examples and examine the results.
# let me know if you find something which not work as you expect
是否有一种方法可以编写递归函数,该函数打印数字中的位数,以便: -它是一个无效函数 -"if"条件是if(num==0),返回 -“else”将调用递归。 我看到了两种不同类型的代码,其中一种是“if”条件具有递归调用,另一种是用于“return”。但这不是我想要的。 我很不擅长递归,并试图通过自己编写代码来理解它,但没有成功。 这是我的代码(我明白为什么它打印122而不是3,但我真的不知道如何以
定义一个接受1个参数的count_down函数。当你调用count_down(3)时,输出应该是这样的:3...2...1...0!。 我的代码如下: 但是输出是[3,2,1,0][4,3,2,1,0]如何获得如所讨论的格式所描述的格式:3...2...1...0!
我想用尽可能多的方法解决塔式料斗问题,并计算每种方法的时间复杂性(仅用于自我练习)。解决方案之一是: 我知道递归时间复杂度计算的一般想法,但我在分析注释行(在 for 循环内)时遇到了麻烦。通常我用 )计算时间复杂度,并用一般表达式(例如 T(n-k))降低它,直到我达到基本情况并且可以用 n 表示 k,但是 for 循环的时间复杂度是多少?
我有一个递归函数,它会重复这个函数,直到不满足if条件,然后输出一个整数。但是,此函数之外需要整数的函数正在接收一个单位。我应该如何修改代码以返回int? 这就是整个程序 }
我正在编写一个递归函数,如下所示: 此函数用于接收员工并查找其管理者。如果找到管理器,则将管理器id推送到数组中($)- 所以我的问题是,如果我不在第6行返回递归调用(这是-
本文向大家介绍C#递归实现回文判断算法,包括了C#递归实现回文判断算法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#递归实现回文判断算法,分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的C#程序设计有所帮助。