使用双指针逆序遍历字符串,分别记录单词左右边界。一个指针寻找空格,另一个指针停留在当前单词的尾部。
时间复杂度 O(N) : 其中 N 为字符串的长度,线性遍历字符串。
public String reverseWords(String s) {
s.trim(); //删除字符串首尾空格
int j = s.length() - 1; //指针指向最后一个字符
int i = j;
StringBuilder res = new StringBuilder(); //存储逆序检索到的单词
while(i >= 0){
while(i >= 0 && s.charAt(i) != ' ') i--; //如果不是空格则视为同一个单词
res.append(s.substring(i+1,j+1)+' ');
while(i >= 0 && s.charAt(i) == ' ') i--; //是空格则前一个单词遍历完成
j = i; //双指针一同指向下一个非空格位置
}
return res.toString().trim(); //转化为字符串并返回
}