LeetCode怎样翻转字符串中的单词

发布时间:2021-12-15 14:50:04 作者:小新
来源:亿速云 阅读:174
# LeetCode怎样翻转字符串中的单词

## 问题描述

在LeetCode的[151. 翻转字符串里的单词](https://leetcode-cn.com/problems/reverse-words-in-a-string/)题目中,要求我们:

给定一个字符串 `s`,逐个翻转字符串中每个单词的顺序,同时:

1. 移除前导、尾随和单词间多余的空格
2. 保证翻转后的字符串中单词间有且仅有一个空格分隔

示例:

输入: “ hello world ” 输出: “world hello”


## 解题思路分析

### 方法一:使用语言内置函数(快速解法)

大多数编程语言都提供字符串操作的内置方法,可以快速实现需求:

```python
def reverseWords(s: str) -> str:
    return " ".join(reversed(s.split()))

复杂度分析: - 时间复杂度:O(n) - 空间复杂度:O(n)

方法二:自行实现完整逻辑(面试推荐)

面试时面试官通常希望看到自行实现的完整逻辑,主要分为三个步骤:

  1. 去除多余空格
    • 使用双指针法去除首尾和中间多余空格
  2. 反转整个字符串
    • 将处理后的字符串整体反转
  3. 反转每个单词
    • 最后逐个反转每个单词
def reverseWords(s: str) -> str:
    # 1. 去除多余空格
    def trim_spaces(s):
        left, right = 0, len(s) - 1
        # 去除首尾空格
        while left <= right and s[left] == ' ':
            left += 1
        while left <= right and s[right] == ' ':
            right -= 1
        
        # 去除中间多余空格
        output = []
        while left <= right:
            if s[left] != ' ':
                output.append(s[left])
            elif output[-1] != ' ':
                output.append(s[left])
            left += 1
        return output
    
    # 2. 反转字符数组
    def reverse(l, left, right):
        while left < right:
            l[left], l[right] = l[right], l[left]
            left += 1
            right -= 1
    
    # 3. 反转每个单词
    def reverse_each_word(l):
        n = len(l)
        start = end = 0
        while start < n:
            # 找到单词末尾
            while end < n and l[end] != ' ':
                end += 1
            # 反转单词
            reverse(l, start, end - 1)
            # 更新指针
            start = end + 1
            end += 1
    
    l = trim_spaces(s)
    reverse(l, 0, len(l) - 1)
    reverse_each_word(l)
    return ''.join(l)

边界情况处理

在实际编码中需要特别注意以下边界情况:

  1. 全空格字符串" " 应返回 ""
  2. 连续多个空格"a b" 应变为 "b a"
  3. 前后有空格" hello " 变为 "hello"

复杂度分析

其他语言实现

Java版本

public String reverseWords(String s) {
    // 去除首尾及中间多余空格
    StringBuilder sb = trimSpaces(s);
    // 反转整个字符串
    reverse(sb, 0, sb.length() - 1);
    // 反转每个单词
    reverseEachWord(sb);
    return sb.toString();
}

C++版本

string reverseWords(string s) {
    // 反转整个字符串
    reverse(s.begin(), s.end());
    
    int n = s.size();
    int idx = 0;
    for (int start = 0; start < n; ++start) {
        if (s[start] != ' ') {
            // 填入一个空格
            if (idx != 0) s[idx++] = ' ';
            
            // 遍历到单词末尾
            int end = start;
            while (end < n && s[end] != ' ') 
                s[idx++] = s[end++];
            
            // 反转当前单词
            reverse(s.begin() + idx - (end - start), s.begin() + idx);
            
            // 更新start
            start = end;
        }
    }
    s.erase(s.begin() + idx, s.end());
    return s;
}

总结

解决这类字符串问题通常有以下几个关键点:

  1. 理解题目要求:明确需要处理空格和单词顺序
  2. 分步处理:将问题分解为多个子问题(去空格、整体反转、单词反转)
  3. 注意边界条件:特别是空字符串和全空格情况
  4. 空间优化:某些语言(如C++)可以尝试原地修改

建议读者在理解解法后,尝试自己实现一遍,并思考是否有其他解决方法。这道题也是微软、亚马逊等公司面试中的高频题目,值得重点掌握。 “`

注:实际字数约1100字,可根据需要补充更多实现细节或示例测试用例达到1200字要求。

推荐阅读:
  1. leetcode--字符串翻转
  2. java实现翻转单词顺序列

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

leetcode

上一篇:RPC概念是什么

下一篇:leetCode怎样打印从1到最大的n位数

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》