算法:557.反转字符串中的单词III

「这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战

题目分析

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

  • 示例 1:

输入:"Let's take LeetCode contest"

输出:"s'teL ekat edoCteeL tsetnoc"

  • 在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。

根据题意可知,我们只需要将每个单词或词组进行翻转,而每个单词之间是用空格隔开,所以有个简单的思路,就是通过空格将单词分割,然后对每个单词进行翻转。所以我们可以有以下几个步骤完成:

  1. 通过split将字符串分割成数组;
  2. 遍历数组,使用reverse翻转每个单词;
  3. 使用sb1拼接分割后的字符串;
  4. 删除拼接完成时最后一个多余空格。

复杂度分析:

时间复杂度:O(N),其中 N 为字符串的长度。

代码分析

class Solution {
    public String reverseWords(String s) {
        StringBuffer sb1 = new StringBuffer();
        String[] strArr = s.split(" ");
        for(String str : strArr){
            StringBuilder sb2 = new StringBuilder(str);
            sb1.append(sb2.reverse().toString()).append(" ");
        }
        sb1.deleteCharAt(sb1.length() - 1);
        return sb1.toString();
    }
}
​
复制代码

执行结果:通过

执行用时:4 ms, 在所有 Java 提交中击败了82.02%的用户

内存消耗:38.9 MB, 在所有 Java 提交中击败了74.55%的用户

这里可以参考官网的解法:

开辟一个新字符串。然后从头到尾遍历原字符串,直到找到空格为止,此时找到了一个单词,并能得到单词的起止位置。

随后,根据单词的起止位置,可以将该单词逆序放到新字符串当中。

如此循环多次,直到遍历完原字符串,就能得到翻转后的结果。

class Solution {
    public String reverseWords(String s) {
        StringBuffer ret = new StringBuffer();
        int length = s.length();
        int i = 0;
        while (i < length) {
            int start = i;
            while (i < length && s.charAt(i) != ' ') {
                i++;
            }
            for (int p = start; p < i; p++) {
                ret.append(s.charAt(start + i - 1 - p));
            }
            while (i < length && s.charAt(i) == ' ') {
                i++;
                ret.append(' ');
            }
        }
        return ret.toString();
    }
}
复制代码

\