目录标题
- 2023-8-22 09:53:10
- 原始
- 优化
151. 反转字符串中的单词
2023-8-22 09:53:10
也是想到了快慢指针的思想。
原始
class Solution {
public String reverseWords(String s) {
int length = s.length();
Integer pre = null;
Integer last = null;
StringBuilder stringBuilder = new StringBuilder("");
for (int i = length - 1; i >= 0; i--) {
// 如果是字母第一次出现
if (s.charAt(i) != ' ') {
// 记录单词尾部指针的位置
if (last == null) {
last = i;
}
}
// 字母已经出现过一次,并且又找到了空格,表示,我们已经找到了一个单词了
else if (last != null) {
// 记录单词首部指针的位置
pre = i;
}
// 单词首部指针 和 单词尾部指针 已经找到了
if (last != null && pre != null) {
// 满足 "单词间应当仅用单个空格分隔"
if (!stringBuilder.toString().equals("")) {
stringBuilder.append(" ");
}
// 添加单词
// 以"the sky is blue" 为例子,由于 substring 的语法特性
// last 应为 'e'的下标14;pre 应为 ' '的下标10,也就是 10-14的区间是' blue'
String substring = s.substring(pre + 1, last + 1);
stringBuilder.append(substring);
pre = null;
last = null;
}
}
// 这一步是因为由于 以"the sky is blue" 为例子
// 考虑到这种情况: last 应为 'e'的下标2, 但是pre 是空的
// 也就是 0-2的区间是'the' 也需要加上
// " hello world " 这种首部为 空格就不需要考虑了,因为 last 应为null的
if (last != null) {
if (stringBuilder.toString() != "") {
stringBuilder.append(" ");
}
// 截取 0-2的区间 的区间
String substring = s.substring(0, last + 1);
stringBuilder.append(substring);
}
return stringBuilder.toString();
}
}
优化
class Solution {
public String reverseWords(String s) {
s = s.trim(); // 删除首尾空格
int j = s.length() - 1, 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(); // 转化为字符串并返回
}
}
作者:Krahets
链接:https://leetcode.cn/problems/reverse-words-in-a-string/solutions/2361551/151-fan-zhuan-zi-fu-chuan-zhong-de-dan-c-yb1r/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。