【LeetCode】剑指 Offer 58 - I. 翻转单词顺序
一、双指针
算法解析:
- 倒序遍历字符串 s,记录单词左右索引边界 i,j
- 每确定一个单词的边界,则将其添加至单词列表 res
- 最终,将单词列表拼接为字符串,并返回即可
class Solution{
public String reverseWords(String s){
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; //j 指向下个单词的尾字符
}
return res.toString().trim(); //转化为字符串并返回
}
}
- 时间复杂度 O(n):其中 n 为字符串 s 的长度,线性遍历字符串
- 空间复杂度 O(n):新建的 StringBuilder 中的字符串总长度 ≤ n,占用 O(n) 大小的额外空间