目录标题
- 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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。