LeetCode 0151.翻转字符串里的单词

Posted on 2022-09-15 13:34  林安静  阅读(59)  评论(0编辑  收藏  举报

题目

给你一个字符串 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"
解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/reverse-words-in-a-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

代码随想录

https://gitee.com/programmercarl/leetcode-master/blob/master/problems/0151.翻转字符串里的单词.md#https://gitee.com/link?target=https%3A%2F%2Fleetcode.cn%2Fproblems%2Freverse-words-in-a-string%2F

思路

自己想了个用双指针模拟字母交换的方法,结果推算不出来...思路为0

以下为随想录参考:
  1. 预处理掉多余空格
  2. 字符串全翻转
  3. 识别单词,再以单词为子字符串翻转

按照这个思路可以写如下代码:

class Solution:
    def reverseWords(self, s: str) -> str:
        # 1.预处理掉多余空格
        s = list(s)
        length = len(s)
        i = 0
        j = 0
        while j < length:
            if s[j] == ' ':
                j += 1
                continue
            while j < length and s[j] != ' ':
                s[i] = s[j]
                i += 1
                j += 1
            if j < length:
                s[i] = s[j]
                i += 1
                j += 1
        ## 由于我是为每个单词后部加空格,则尾部可能有多余一个空格
        if s[i - 1] == ' ':
            i -= 1
        s = s[:i]

        # 2.字符串全翻转
        length = len(s)
        i = 0
        j = length - 1
        while i < j:
            temp = s[i]
            s[i] = s[j]
            s[j] = temp
            i += 1
            j -= 1

        # 3.识别单词,再以单词为子字符串翻转
        ## 定义双指针,复用i、j
        i = 0
        while i < length:
            ### 完成单词识别,且在单词起始与结束位置放置双指针
            while i < length and s[i] == ' ':
                i += 1
            j = i
            while j < length and s[j] != ' ':
                j += 1
            left = i
            right = j - 1
            while left < right:
                temp = s[left]
                s[left] = s[right]
                s[right] = temp
                left += 1
                right -= 1
            i = j + 1
        return ''.join(s)

但是去除空格代码有冗余,随想录的精简(c++):

 void removeExtraSpaces(string& s) {//去除所有空格并在相邻单词之间添加空格, 快慢指针。
        int slow = 0;   //整体思想参考https://programmercarl.com/0027.移除元素.html
        for (int i = 0; i < s.size(); ++i) { //
            if (s[i] != ' ') { //遇到非空格就处理,即删除所有空格。
                if (slow != 0) s[slow++] = ' '; //手动控制空格,给单词之间添加空格。slow != 0说明不是第一个单词,需要在单词前添加空格。
                while (i < s.size() && s[i] != ' ') { //补上该单词,遇到空格说明单词结束。
                    s[slow++] = s[i++];
                }
            }
        }
        s.resize(slow); //slow的大小即为去除多余空格后的大小。
    }