刷题笔记-557. 反转字符串中的单词 III

178 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第23天,点击查看活动详情

一、题目描述:

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

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

二、思路分析:

从前遍历,找到空格,这样就找到一个单词了,开辟一个数组,将单词其逆序放到新数组中,使用一个记录变量,记录该单词占位多少,以便找到下次新数组存放开始位置。最后一个单词后面没有空格,所以要单独拿出来进行操作

可以不必要将字符串转换为数组,本人是不太熟悉字符串一些操作,所以这样写。

三、AC 代码:

class Solution {
    public String reverseWords(String s) {
        char[] array = s.toCharArray();//将字符串转换为字符数组,以便找下标操作
        char[] answer = new char[array.length];//开辟一个新数组存放逆序单词
        int i=0,j=0;
        int temp=0;//记录下一次往新数组存放的开始位置
        while(j<array.length){
            if(array[j]==' '){//找到空格,对单词进行操作
                for(int k=j-1;k>=temp;k--){//逆序存放
                    answer[i++] = array[k];
                }
                answer[i] = ' ';//单词后面补充空格
                i++;
                temp = j+1;//下一次往新数组存放的开始位置
            }
            j++;
        }
        for(int k=j-1;k>=temp;k--){//最后一个单词后面没有空格,单独拿出来进行操作
            answer[i++] = array[k];
        }
        String result = String.valueOf(answer);//将字符数组转换成字符串
        return result;
    }
}

范文参考:

用vector记录每一个空格位置和最后的'\0'位置 - 反转字符串中的单词 III - 力扣(LeetCode)