• LeetCode 557. 反转字符串中的单词 III


    557. 反转字符串中的单词 III

    难度简单469

    给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。

    示例 1:

    输入:s = "Let's take LeetCode contest"
    输出:"s'teL ekat edoCteeL tsetnoc"
    

    示例 2:

    输入: s = "God Ding"
    输出:"doG gniD"
    

    提示:

    • 1 <= s.length <= 5 * 104
    • s 包含可打印的 ASCII 字符。
    • s 不包含任何开头或结尾空格。
    • s 里 至少 有一个词。
    • s 中的所有单词都用一个空格隔开。

    思路:

    • 先根据空格将s拆分为字符串数组
    • 字符串数组中的元素交换位置:字符串是常量不能随意修改,所以要再转化为[]byte数组后才能进行下标操作
    • 将交换位置后的字符串存入res字符串数组中,并对其进行空格拼接

    时间复杂度:O(N)

    空间复杂度:方法1 O(N),方法2 O(1)

    1. // 方法1:空间复杂度O(N)
    2. // 先根据空格将s拆分为字符串数组
    3. // 字符串数组中的元素交换位置:字符串是常量不能随意修改,所以要再转化为[]byte数组后才能进行下标操作
    4. // 将交换位置后的字符串存入res字符串数组中,并对其进行空格拼接
    5. func reverseWords(s string) string {
    6. strArr := strings.Split(s, " ")
    7. res := make([]string, 0)
    8. for _, ss := range strArr {
    9. byteSs := []byte(ss)
    10. for l, r := 0, len(byteSs)-1; l < r; {
    11. byteSs[l], byteSs[r] = byteSs[r], byteSs[l]
    12. l++
    13. r--
    14. }
    15. res = append(res, string(byteSs))
    16. }
    17. return strings.Join(res, " ")
    18. }
    19. // 方法2 原地修改:空间复杂度O(1)
    20. func reverseWords(s string) string {
    21. // byteS := []byte(s)
    22. reverseString := func(bs []byte) {
    23. for left, right := 0, len(bs) - 1; left < right; {
    24. bs[left], bs[right] = bs[right], bs[left]
    25. left++
    26. right--
    27. }
    28. }
    29. byteS := []byte(s)
    30. for i, j := 0, 0; i < len(byteS); i = j {
    31. for j < len(byteS) && s[j] != ' ' {
    32. j++
    33. }
    34. reverseString(byteS[i:j])
    35. j++ // 跳到下一个单词起点
    36. }
    37. return string(byteS)
    38. }

  • 相关阅读:
    在PyCharm中添加anaconda环境
    Kubernetes面试整理-ELK和EFK的区别?
    [附源码]java毕业设计中华美食网站
    Hackthebox系列 Starting point Tier0 Meow记录
    HTML 简介
    Java要抛弃祖宗的基业,Java程序员危险了!
    Pytorch环境配置——从零开始(不需要anaconda)
    关于【统一权限系统】概况
    费用流模板
    数据安全出境系列——数据追溯能力
  • 原文地址:https://blog.csdn.net/qq_37102984/article/details/126292103