【LeetCode】151. 反转字符串中的单词 - 双指针

目录标题

  • 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();
    }
}

【LeetCode】151. 反转字符串中的单词 - 双指针_第1张图片

优化

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

你可能感兴趣的:(#,LeetCode,leetcode,java,数据库)