【问题标题】:Recursive Function for Counting Palindromes计算回文数的递归函数
【发布时间】:2020-11-08 07:27:56
【问题描述】:

我知道这个问题被问了很多,但我遇到的问题略有不同。这个任务要求我不要验证一个字符串是否是回文 - 但要验证一个字符串中有多少回文(返回为“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]

我只是很难将其转换为递归函数。感谢您提供任何和所有帮助!

【问题讨论】:

  • 请提供您目前所写的内容
  • 另外,请举例说明输入和预期结果。
  • 老实说,到目前为止,除了解决这个问题的迭代版本之外,我真的没有写任何东西;-;但是,我可以提供输入和预期结果的示例!我们在课堂上给出的例子是“kayak”,这个字符串中回文数的预期结果是“2”!我希望这会有所帮助:)

标签: python function recursion


【解决方案1】:

我想我做到了!看看我的递归实现,它找到了字符串中的所有回文,在我看来,这不是解决它的最干净的方法(任何使它更简单的建议都非常受欢迎),请随时询问任何不清楚的地方你:

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

【讨论】:

  • 这对我提供的回文非常有效(例如皮划艇)!我只是想知道是否有办法将字符串中打印的回文数转换为整数?无论哪种方式,我们都非常感谢您的帮助!
  • len(found) 是整数的答案。是这个意思吗?
  • 天哪,这太完美了!完全忘记了python中的长度特性..非常感谢;;
【解决方案2】:

我有一个递归解决方案,但它再次计算了一些值,这些值可以通过动态编程(记忆化)来克服。任何建议将不胜感激。 所以,这里是递归的伪代码。

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 数组来跟踪已经计算的子问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-25
    • 2015-07-28
    • 1970-01-01
    • 2014-06-08
    • 2013-11-26
    • 2021-05-03
    • 1970-01-01
    • 2023-02-04
    相关资源
    最近更新 更多