【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.

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