双指针法
如其名
翻转字符串里的单词
给定一个字符串,逐个翻转字符串中的每个单词
输入: "the sky is blue"
输出: "blue is sky the"
输入: " hello world! "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
输入: "a good example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
说明:
无空格字符构成一个单词。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
方法
双指针法
定义两个指针,从右到左搜索,遇见单词加入,空格略过
时间复杂度 O(N) : 其中 NN 为字符串 ss 的长度,线性遍历字符串。
空间复杂度 O(N) : 新建的 list(Python) 或 StringBuilder(Java) 中的字符串总长度 <= N ,占用 O(N) 大小的额外空间。
class Solution58 {
public String reverseWords(String s) {
s.trim();//先清除空格
int j = s.length() -1;// 定义双指针
int i = j;// i用来遍历单词和空格
StringBuilder sb = new StringBuilder();
while (i >= 0){
while (i >=0 && s.charAt(i) != ' '){// 当是字母的时候
i--;
}
sb.append(s.substring(i+1,j+1)+" ");// 加空格美观 因为subString 所以要+1
while (i >= 0 && s.charAt(i) == ' '){// 当不是字母的时候
i--;
}
j = i;
}
return sb.toString().trim();
}
}