LeetCode151.反转字符串中的单词

发布时间 2023-10-26 22:46:46作者: 白布鸽

题目描述

给你一个字符串 s ,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的单词分隔开。
返回单词顺序颠倒且单词之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

示例

image

提交的代码

class Solution {
    public String reverseWords(String s) {
        StringBuilder res=new StringBuilder();
        //先找到start和end的index,这个过程也是去除首尾的空格
        int start=0;
        int end=s.length()-1;
        int right,left;
        while(s.charAt(start)==' '){
            start++;
        }
        while(s.charAt(end)==' '){
            end--;
        }
        //start和end的index已经确定,下面需要给left和right赋初始值
        right=end+1;
        left=end;
        boolean flag=false;
        while(left>=start){
            //找到空格的Index
            while(s.charAt(left)!=' '){
                left--;
                if(left<start){
                    flag=true;
                    break;
                }
            }
            if(flag)break;
            //结果字符串赋值
            res.append(s.substring(left+1,right));
            //再添加空格
            res.append(" ");
            //判断单词之间是否有若干空格,找到第一个空格
            while(left>=start&&s.charAt(left-1)==' ')left--;
            right=left;
            left--;
        }
        res.append(s.substring(left+1,right));
        return res.toString();
    }
}

思想:双指针法。题目要求去除string的首尾空格,因此需要两个指针start end来记录去除首尾空格之后的内容的起始和结束index,right和left两个指针的初始index为end+1和end,然后left去找遇到的第一个空格,然后用substring()方法截取单词加入到StringBuilder对象中,StringBuilder对象再添加一个空格,然后left需要去去除单词间的多余的空格,找到单词间若干空格的第一个空格,赋值给right,然后left再去找下一个空格,然后截取字符串。
示意图如下:
image

image

学习到的东西

看了大神的方法,他的方法分为三步:

  1. 去除首尾以及单词间的空格
  2. 将去重过的字符串全部反转
  3. 再把每个单词都反转