【问题标题】:Reverse a string in-place using recursion使用递归就地反转字符串
【发布时间】:2020-08-17 15:06:47
【问题描述】:

有一个关于递归的leetcode问题。使用递归将字符串原地反转。不要分配额外的数组。

编写一个反转字符串的函数。输入字符串为 字符数组 char[].

不要为另一个数组分配额外的空间,你必须这样做 使用 O(1) 额外内存就地修改输入数组。

您可以假设所有字符都由可打印的 ASCII 组成 字符。

我的解决方案不起作用,因为我的切片操作员正在创建列表的副本,而不是就位。我似乎无法向函数添加参数,因为测试工具不需要额外的参数。

如果没有额外的参数来检测您尝试反转的字符串中的当前位置索引,或者没有通过递归调用附加到的中间数据结构,您如何做到这一点?

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        
        if len(s) <= 1:
            return
        
        temp = s[0]
        s[0] = s[len(s)-1]
        s[len(s)-1] = temp        
        return self.reverseString(s[1:len(s)-1])
        

输入“hello”的函数返回["o","e","l","l","h"]。这是因为第一次调用该函数时,它在原地操作列表,随后的调用是通过字符串的切片来实现的。

【问题讨论】:

  • 为什么不给你想要的附加参数一个默认值?
  • 我认为这不可能。那里有一堵墙。
  • 你是对的,添加一个默认参数让我开始。谢谢@superbrain
  • 但是请注意,递归堆栈占用 O(n) 额外空间,因此无论如何都不能满足要求。
  • @superbrain 他们只是在递归教程中将问题重新定义为递归问题。所以问题本身只有一个小提示图标说,尝试用递归解决。我知道如何用两个指针非递归地解决它。

标签: python


【解决方案1】:

据我了解,解决方案应该是递归的。试试这个:

编辑:(应该在 leetcode 中查看)

def reverseStringHelper(s, index):
    length = len(s)
    if index >= length / 2:
        return
    
    temp = s[index]
    s[index] = s[length - 1 - index]
    s[length - 1 - index] = temp
    reverseString(s, index + 1)

def reverseString(s):
    reverseStringHelper(s, 0)

定义arr = ['h', 'e', 'l', 'l' ,'o'] 并调用reverseString(arr, 0) 将导致['o', 'l', 'l', 'e', 'h']

您可以从不同的函数调用它,因此它只接受列表。

【讨论】:

  • 问题是我无法弄清楚如何在没有 leetcode 测试工具抱怨的情况下向函数添加参数。感谢@superbrain,我添加了一个默认参数
  • 为此,我通常会调用一个辅助函数来填充给定的默认函数,该函数接受你需要的任何东西(就像我在回答中写的那样)。
【解决方案2】:

谢谢大家。解决方案是添加一个带有默认值的参数,以解决 leetcode 测试工具的问题,所以现在我可以这样做:

   class Solution:
    def reverseString(self, s: List[str], start = 0) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        if len(s[start:len(s)-start]) <= 1:
            return
        
        end = len(s) - start - 1 # end postition
        
        temp = s[start]        
        s[start] = s[end]        
        s[end] = temp
        
        self.reverseString(s, start+1)
        
        

【讨论】:

    【解决方案3】:

    试试这个

    chars=list('string')
    for i in range((len(chars)-len(chars)%2)//2):
        chars[i], chars[-i-1]=chars[-i-1], chars[i]
    print(chars)
    print(''.join(chars))
    

    【讨论】:

      【解决方案4】:

      这会过去的,因为它必须完成in-place

      from typing import List
      
      class Solution:
          def reverseString(self, s: List[str]) -> None:
              """
              Do not return anything, modify s in-place instead.
              """
      
              left, right = 0, len(s) - 1
              while left < right:
                  s[left], s[right] = s[right], s[left]
                  left, right = left + 1, right - 1
      

      参考文献

      • 有关更多详细信息,请参阅Discussion Board,您可以在其中找到大量解释清楚且公认的解决方案,其中包含各种languages,包括低复杂度算法和渐近runtime/memory 分析@ 987654326@, 2.

      【讨论】:

      • s.reverse() 相比,我不会称其为“简单”:-P
      • 是的,LeetCode 还在面试的美好时光......
      • 这不是递归解决方案,这是他们所要求的
      • Python 字符串是不可变的,因此问题变得不可能。如果传递str,此代码将失败。
      • @MarkRansom 它没有传递str,它传递了一个单字符列表strs。
      猜你喜欢
      • 1970-01-01
      • 2017-07-20
      • 2014-06-10
      • 2011-07-28
      • 2015-09-27
      • 2017-06-11
      相关资源
      最近更新 更多