代码随想录算法训练营第8天|字符串|344.反转字符串541.反转字符串II151.翻转字符串里的单词

代码随想录算法训练营第8天|字符串|344.反转字符串541.反转字符串II151.翻转字符串里的单词

一、344.反转字符串

文档链接:代码随想录

题目链接:344.反转字符串

视频讲解:视频讲解

题目描述:

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须**原地修改输入数组**、使用 O(1) 的额外空间解决这一问题。

示例 1:

输入:s = ["h","e","l","l","o"]
输出:["o","l","l","e","h"]

示例 2:

输入:s = ["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]

提示:

  • 1 <= s.length <= 105
  • s[i] 都是 ASCII 码表中的可打印字符

代码:

  • 双指针法

思路:初始化两个指针,一个在最左边为0,另一个在最右面最后一个索引,两个指针同时向中间移动,并且交换元素,原地修改字符串。

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        left = 0  # 初始化左指针,指向字符串的开始
        right = len(s) - 1  # 初始化右指针,指向字符串的末尾
        while left < right:  # 当左指针小于右指针时,执行循环
            # 交换左指针和右指针所指向的字符
            s[left], s[right] = s[right], s[left]
            left += 1  # 左指针向右移动
            right -= 1  # 右指针向左移动

二、541.反转字符串II

文档链接:代码随想录

题目链接:541.反转字符串II

视频讲解:视频讲解

题目描述:

  • 给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

    • 如果剩余字符少于 k 个,则将剩余字符全部反转。
    • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

    示例 1:

    输入:s = "abcdefg", k = 2
    输出:"bacdfeg"
    

    示例 2:

    输入:s = "abcd", k = 2
    输出:"bacd"
    

    提示:

    • 1 <= s.length <= 104
    • s 仅由小写英文组成
    • 1 <= k <= 104

代码:

思路:使用双指针法来处理字符串中的每个2k长度的子串,并在每个子串中反转前k个字符。函数通过循环来处理所有子串,直到所有字符都被处理完毕。最后,函数返回反转后的字符串。

class Solution:
    def reverseStr(self, s: str, k: int) -> str:
        # 计算需要反转的起始位置和长度
        start = 0
        length = len(s)
        while start < length:
            # 反转前k个字符
            # 将字符串s中从位置start开始的连续2k个字符中的前k个字符进行反转
            # 然后将反转后的结果与剩余的字符重新组合成一个新的字符串
            s = s[:start] + s[start:start + k][::-1] + s[start + k:]
            # 更新起始位置
            start += 2 * k
        return s
  1. s = s[:start]:这一部分从原始字符串s中获取从开始到start位置(不包括start位置)的所有字符。也就是说,它会获取字符串的前start个字符。
  2. s[start:start+k][::-1]:这一部分稍微复杂一些。首先,它从原始字符串s中获取从startstart+k-1位置的子串。然后,它对这个子串进行反转操作。在Python中,[::-1]是一个常用的字符串反转技巧。
  3. s[start+k:]:这一部分从原始字符串s中获取从start+k位置到最后(包括结束位置)的所有字符。也就是说,它会获取从字符串的start+k位置之后的所有字符。

三、151.翻转字符串里的单词

文档链接:代码随想录

题目链接:151.翻转字符串里的单词

视频讲解:视频讲解

题目描述:

给你一个字符串 s ,请你反转字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

注意: 输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

示例 1:

输入:s = "the sky is blue"
输出:"blue is sky the"

示例 2:

输入:s = "  hello world  "
输出:"world hello"
解释:反转后的字符串中不能存在前导空格和尾随空格。

示例 3:

输入:s = "a good   example"
输出:"example good a"
解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。

提示:

  • 1 <= s.length <= 104
  • s 包含英文大小写字母、数字和空格 ' '
  • s至少存在一个 单词

进阶: 如果字符串在你使用的编程语言中是一种可变数据类型,请尝试使用 O(1) 额外空间复杂度的 原地 解法。

代码:

  • 双指针法
    思路:使用split()函数将字符串s拆分成单词列表。然后,通过双指针方法(left和right)从列表的两端开始,将元素进行交换,直到左指针大于或等于右指针。这个过程实现了单词的反转。最后,使用join()函数将反转后的单词列表重新组合成字符串,并用单个空格连接。
class Solution:
    def reverseWords(self, s: str) -> str:
        # 将字符串拆分为单词,即转换成列表类型
        words = s.split()

        # 反转单词
        left, right = 0, len(words) - 1
        while left < right:
            words[left], words[right] = words[right], words[left]
            left += 1
            right -= 1

        # 将列表转换成字符串
        return " ".join(words)

你可能感兴趣的:(算法,算法,数据结构)