20天算法刷题计划-557. 反转字符串中的单词 III

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

给定一个字符串 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 中的所有单词都用一个空格隔开。


复制代码

二、思路分析:

分析题目,注意点如下:

1.反转单词中字母顺序

2.保持原有单词顺序和空格

3.至少 有一个词

根据题目分析, 使用额外的空间,将字符串放入数组中,遍历原有字符串,根据空格把字符串拆分成多个单词的字符串,我们只关心空格字符和最后一个字符,于是,遇到正常的字母字符一概不管;当找到空格时就找到了一个单词, 并将单词的字符串进行反转,然后继续找到下一个单词,最后 将反转的单词字符串拼接起来就是最终答案。

三、AC 代码:

class Solution {
    public String reverseWords(String s) {
        char[] chars = s.toCharArray();
        int left = 0;
        for (int i = 0; i < s.length(); i++) {    
            char currentChar = s.charAt(i);
            if (currentChar == ' ') {       
                reverse(chars, left, i - 1);          
                left = i + 1;
            } else if (i == s.length() - 1) {       
                reverse(chars, left, i);
            }
        }
        return String.valueOf(chars);
    }

     private static void reverse(char[] chars, int start, int end) {
        while (start < end) {
            char temp = chars[start];
            chars[start] = chars[end];
            chars[end] = temp;
            end --;
            start ++;
        }
    }
}

复制代码

四、总结:

image-20220311093524880

执行结果通过了,但是看内存和执行用时并不是很高,应该还有很多更好的思路,可以多去看看大佬们的题解扩充下思路。

写题解不易,若对你有帮助,点赞评论再走吧。ヽ(✿゚▽゚)ノ

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享