代码随想录算法训练营第八天(补)|344. 反转字符串、541. 反转字符串II、剑指05. 替换空格、151.翻转字符串里的单词、剑指58-II.左旋转字符串

105 阅读3分钟

344. 反转字符串

题目描述:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

题目链接:leetcode.cn/problems/re…

解题思路:

使用 O(1) 的额外空间解决这一问题,想到双指针。

代码:

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

        while left <= right:
            s[left], s[right] = s[right], s[left]
            left += 1
            right -= 1
        
        return s

541. 反转字符串II

题目描述:给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。如果剩余字符少于 k 个,则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

题目链接:leetcode.cn/problems/re…

解题思路:

  1. 写一个344. 反转字符串的原地反转字符串函数。
  2. 使用list()函数将字符串s转换为列表型,之后利用切片,for循环的范围是[0,2 * k),间隔是kres[i:i + k] = reverse(res[i:i + k])
  3. 注意返回类型是字符串,所以要使用''.join(res)函数,将列表转换为字符串。

代码:

class Solution:
    def reverseStr(self, s: str, k: int) -> str:

        def reverse(s):
            length = len(s)
            left, right = 0, length - 1
            while left < right:
                temp = s[right]
                s[right] = s[left]
                s[left] = temp
                right -= 1
                left += 1
            return s

        n = len(s)
        res = list(s)
        for i in range(0, n, 2 * k):
            res[i:i + k] = reverse(res[i:i + k])

        return ''.join(res)

剑指offer05. 替换空格

题目描述:请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

题目链接:leetcode.cn/problems/ti…

解题思路:

  1. 首先统计字符串中空格的数量count,再把字符串长度扩充 2 * count的长度(使用extend()函数)。
  2. 使用双指针。right指针指向字符串扩充后的末尾,left指向字符串扩充前的末尾。当left >=0时,如果s[left]不为空格,那么s[right] = s[left]。如果s[left]是空格,那么s[right - 2 : right + 1] = '%20',完成后right -= 3left -= 1

代码:

class Solution:
    def replaceSpace(self, s: str) -> str:
        counter = s.count(' ')
        res = list(s)
        pre = len(res) - 1
        res.extend([' '] * counter * 2)
        cur = len(res) - 1

        while pre >= 0:
            if res[pre] != ' ':
                res[cur] = res[pre]
                cur -= 1
            else:
                res[cur - 2 : cur + 1] = "%20"
                cur -= 3
            pre -= 1
        
        return ''.join(res)

151.翻转字符串里的单词

题目描述:给你一个字符串 s ,请你反转字符串中 单词 的顺序。单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。注意:输入字符串 s 中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

题目链接:leetcode.cn/problems/re…

解题思路:

  1. 去除首尾空格和单词之间的多余空格。
  2. 整个字符串反转。
  3. 单个单词反转。

代码:

class Solution:
    def remove_sapce(self, st):
        n = len(st)
        st = list(st)
        
        left, right = 0, n - 1

        while left <= right and st[left] == ' ':
            left += 1
        
        while left <= right and st[right] == ' ':
            right -= 1
        
        tmp = []
        while left <= right:
            if st[left] != ' ':
                tmp.append(st[left])
            else:
                if tmp[-1] != ' ':
                    tmp.append(st[left])
            left += 1
        
        return tmp

    def reverse(self, st, left, right):
        while left <= right:
            st[left], st[right] = st[right], st[left]
            left += 1
            right -= 1
        return 
    
    def reverse_a_word(self, st):
        start, end = 0, 0
        n = len(st)

        while start < n:
            while end < n and st[end] != ' ':
                end += 1
            self.reverse(st, start, end - 1)
            start = end + 1
            end += 1
        return

    def reverseWords(self, s: str) -> str:
        st = self.remove_sapce(s)
        self.reverse(st, 0, len(st) - 1)
        self.reverse_a_word(st)
        return ''.join(st)

剑指offer 58-II.左旋转字符串

题目描述:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。

题目链接:leetcode.cn/problems/zu…

解题思路:

  1. 写一个原地反转字符串的函数。
  2. 反转s[:k]
  3. 反转s[k:len(s)]
  4. 反转s

代码:

class Solution:
    def reverse(str, s, left, right):
        while left <= right:
            s[left], s[right] = s[right], s[left]
            left += 1
            right -= 1
        return s

    def reverseLeftWords(self, s: str, k: int) -> str:
        n = len(s)
        s = list(s)
        s = self.reverse(s, 0, n - 1)
        self.reverse(s, 0, n - 1 - k)
        self.reverse(s, n - k, n - 1)

        return "".join(s)