LeetCode讲解篇之151. 反转字符串中的单词

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) 额外空间复杂度的 原地 解法。

解答思路

对于这道题,我们可以将字符串按照空白字符串分隔来得到字符串单词数组,然后对该单词数组反转,即可得到最终结果

解答代码

func reverseWords(s string) string {
    // 单词数组
    words := make([]string, 0)
    // 当前单词的开始下标
    var start = -1

    // 遍历字符串,提取单词数组
    for i := 0; i < len(s); i++ {
        if start == -1 && s[i] != ' ' {
            // 如果当前单词还不存在开始下标,并且当前字符不为空格,则意味着字符是当前单词的开始,更新当前单词开始下标
            start = i
        } else if start >= 0 && s[i] == ' ' {
            // 当前单词存在开始下标,并且当前字符为空格,则意味着当前单词已遍历完毕,当前下标就是当前单词结束下标的下一个,追加当前单词,取消下个单词的开始下标
            words = append(words, s[start:i])
            start = -1
        }
    }

    if start >= 0 {
        // 当前单词存在开始下标,意味着当前单词不存在空格,因为遇到空格当前单词会被追加,并且取消开始下标,应此可以放心的追加当前单词
        words = append(words, s[start:len(s)])
    }
    
    // 单词数据的长度
    l := len(words)
    // 单词数组的长度的一半
    n := l >> 1
    l--

    // 遍历单词数组的左半边,反转单词数组
    for i := 0; i < n; i++ {
        // 对换当前单词和当前单词沿单词数组的中心轴对称的单词
        words[i], words[l-i] = words[l-i], words[i]
    }
    return strings.Join(words, " ")
}

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