【LeetCode】186. Reverse Words in a String II

LeetCode186 傳送門

解法:

同“我的心路”。

class Solution:
    def reverseWords(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        self.reverse(s, 0, len(s))
        
        begin = 0
        for i in range(len(s) + 1):
            if i == len(s) or s[i] == ' ':
                self.reverse(s, begin, i)
                begin = i + 1
        
    def reverse(self, s, begin, end):
        for i in range((end - begin) // 2):
            tmp = s[begin + i]
            s[begin + i] = s[end - i - 1]
            s[end - i - 1] = tmp

我的心路:

    讓原字符串原地翻轉有一個問題要解決,就是原地翻轉的話字符串中的單詞會跟着翻轉。於是先將原字符串中的所有單詞翻轉,然後將整個字符串翻轉,則單詞翻回原樣。這是一個two-pass算法,時間複雜度O(n\cdot m),空間複雜度O(1),其中m是字符串中的單詞平均長度。我的解法和clean code handbook相同,解法很容易想到,最終結果也還不錯,但時間複雜度似乎還需要進步。

class Solution(object):
    def reverseWords(self, s):
        """
        :type s: List[str]
        :rtype: None Do not return anything, modify s in-place instead.
        """
        left = 0
        for i in range(len(s)):
            if s[i] == ' ' or i == len(s) - 1:
                right = i - 1
                if i == len(s) - 1:
                    right = i
                while left < right:
                    tmp = s[left]
                    s[left] = s[right]
                    s[right] = tmp
                    left += 1
                    right -= 1
                left = i + 1
                    
        s_len = len(s)
        for i in range(s_len // 2):
            tmp = s[i]
            s[i] = s[s_len - 1 - i]
            s[s_len - 1 - i] = tmp

Runtime: 244 ms, faster than 41.75% of Python online submissions forReverse Words in a String II.

Memory Usage: 21.1 MB, less than 100.00% of Python online submissions for Reverse Words in a String II.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章