我一开始的想法是利用栈的先进后出的思想反转字符串即可,但是要注意特殊的输入用例,比如全部字符串字符为空,此时应返回原字符串即可,还有需要注意最后一个输出的子字符串(student)没有空格,因此最后一个子字符串可以不入队,当然也可以使用subString方法不返回最后一个空格。
记录split()方法:以某个符号分割字符串成为字符串数组

import java.util.Stack;
public class Solution {
    public String ReverseSentence(String str) {
        if(str==null||str.length()<=0){
            return str;
        }
       String[] s=str.split(" ");//使用split来对字符串进行分割,这里使用空格进行分割
        if(s.length==0)//如果该字符串中除空格外不存在字符,则分割后字符串数组为空,直接返回原字符串即可
            return str;
       Stack<String> res=new Stack<>();
       String ans="";
       for(int i=0;i<s.length;i++){
           res.push(s[i]);
       }
        while(!res.isEmpty()){
            ans+=res.pop();
            ans+=" ";
        }
        return ans.substring(0,ans.length()-1);
     }
}

但这种方法利用了辅助空间,增加了空间复杂度。下面记录滑动窗口法:
1.将整个字符串反转
2.再逐个反转
最后需要把字符数组转化为字符串:String.valueOf(s);

import java.util.Stack;
public class Solution {
    public String ReverseSentence(String str) {
        if(str==null||str.length()<=0){
            return str;
        }
        char[] s=str.toCharArray();
        Reverse(0,str.length()-1,s);//整体反转
        int l=0;
        int r=0;
        while(l<str.length()){
            if(s[r]==' '){
                Reverse(l,r-1,s);
                r++;
                l=r;
            }
            if(r==s.length-1){
                Reverse(l,r,s);
                break;
            }
            r++;
        }
        return String.valueOf(s);

}
    private void Reverse(int l,int r,char[] s){
        while(l<r)
        {
           char tmp=s[l];
            s[l]=s[r];
            s[r]=tmp;
            l++;
            r--;
        }
    }
}