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

57 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第17天,点击查看活动详情

一、题目描述:

557. 反转字符串中的单词 III - 力扣(LeetCode) (leetcode-cn.com)

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

示例 1:

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

示例 2:

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

提示:

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

二、思路分析:

因为Java的String是不可变的,所以需要额外的空间(创建char数组)。
采用双指针(快慢指针)的解法,快指针负责检查空格,慢指针定在单词的第0个字符。
所以当快指针所指向的字符为空格或者超出数组长度时,将慢指针与快指针-1之间的字符进行反转。
反转的代码类似【344. 反转字符串】,采用头尾指针进行反转。
最后将char数组转换为String返回即可。

三、AC 代码:

class Solution {
    public String reverseWords(String s) {
        char[] arr = s.toCharArray();
        int slow=0, fast=0;
        while(fast<=arr.length) {
            if(fast==arr.length || arr[fast]==' ') {
                //reverse arr between slow and fast-1
                int i=slow, j=fast-1;
                while(i<j) {
                    char temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                    i++;
                    j--;
                }
                fast++;
                slow = fast;
            }else {
                fast++;
            }
        }
        return new String(arr);
    }
}

范文参考:

超过100% Java 超简单解题思路 原地解法 - 反转字符串中的单词 III - 力扣(LeetCode)

【track & traning】一行代码,思路简单,性能高效接近100 - 反转字符串中的单词 III - 力扣(LeetCode)

关于字符串反转的三种不同实现(反转字符串中的单词 III) - 反转字符串中的单词 III - 力扣(LeetCode)