簡體   English   中英

使用遞歸就地反轉字符串

[英]Reverse a string in-place using recursion

有一個關於遞歸的leetcode問題。 使用遞歸將字符串原地反轉。 不要分配額外的數組。

編寫一個反轉字符串的 function。 輸入字符串以字符數組 char[] 的形式給出。

不要為另一個數組分配額外的空間,您必須通過使用 O(1) 額外的 memory 就地修改輸入數組來做到這一點。

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

我的解決方案不起作用,因為我的切片操作員正在創建列表的副本,而不是就位。 我似乎無法向 function 添加參數,因為測試工具不希望有額外的參數。

如何做到這一點,沒有額外的參數來檢測當前 position 索引到你試圖反轉的字符串中,或者沒有中間數據結構你 append 通過遞歸調用?

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])
        

我的 function 輸入 "hello" 返回["o","e","l","l","h"] 這是因為第一次調用 function 時,它對列表進行就地操作,后續調用是通過字符串的切片實現的。

謝謝大家。 解決方案是添加一個帶有默認值的參數,以解決 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)
        
        

嘗試這個

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))

據我了解,解決方案應該是遞歸的。 嘗試這個:

編輯:(應該在 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']

您可以從不同的 function 調用它,因此它只會接受該列表。

這會過去的,因為它必須就地完成:

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

參考

  • 有關更多詳細信息,請參閱討論板,您可以在其中找到大量解釋清楚且公認的解決方案,這些解決方案具有多種語言,包括低復雜度算法和漸近運行時/ memory分析12

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM