leetcode-中等题-51. 翻转字符串里的单词

本文分析了一种在LeetCode反转字符串问题中使用StringBuilder优化解法的博客,重点讲解了如何利用StringBuilder的便捷操作反转单词和去除多余空格,对比初级解法并提供了一位作者的优质解决方案。
摘要由CSDN通过智能技术生成

https://leetcode-cn.com/problems/reverse-words-in-a-string/
好吧今天又傻一天,可变字符串的交换给我整傻了,再没有像原来的String那么好操作了,写出了个稀巴烂的代码,回头复习一下别人的优质解法。
主要研究一下StringBuilder这个类的用法,在里面怎么反转字符串
我的解法:

class Solution {
    public String reverseWords(String s) {
        //初级解法
        //先分割
        //由后往前拼接
        String[] str = s.split(" ");
        int len = str.length;
        StringBuilder sb = new StringBuilder();
        for(int i = len - 1; i >= 0; i--){
            if(str[i] == "")continue;
            sb.append(str[i]+" ");
            System.out.println(str[i]);//原来分割之后空格也会在数组里面单独出现
        }
        len = sb.length();//除去空格
        return sb.substring(0, len-1);
    }
}

优质解法:

class Solution {
    public String reverseWords(String s) {
        StringBuilder sb = removeSpace(s); // 1. 去除字符串前后以及中间多余的空格
        reverseString(sb, 0, sb.length() - 1); // 2. 翻转整个字符串 
        reverseEachWord(sb); // 3. 翻转每个单词
        return sb.toString();
    }

    public void reverseString(StringBuilder sb, int start, int end) {
        while (start < end) {
            char temp = sb.charAt(start);
            sb.setCharAt(start, sb.charAt(end));
            sb.setCharAt(end, temp); // 双指针交换StringBuilder前后的字符
            start++;
            end--;
        }
    }

    public StringBuilder removeSpace(String s) {
        StringBuilder sb = new StringBuilder();
        int start = 0;
        int end = s.length() - 1;
        while (s.charAt(start) == ' ') start++; // 删除字符串开头的空格
        while (s.charAt(end) == ' ') end--; // 删除字符串末尾的空格
        while (start <= end) {
            char c = s.charAt(start);
            if (c != ' ' || sb.charAt(sb.length() - 1) != ' ') { // 当前字符为字母或者单词后的第一个空格(不是多余空格)
                sb.append(c); // 此步骤去除字符串中间多余的空格, 将当前字符添加到StringBuilder
            }
            start++;
        }
        return sb;
    }

    public void reverseEachWord(StringBuilder sb) {
        int start = 0;
        int end = 1;
        int len = sb.length();
        while (start < len) {
            while (end < len && sb.charAt(end) != ' ') { // end指针记录每个单词后空格的位置
                end++;
            }
            reverseString(sb, start, end - 1); // 翻转end指针前的单词
            start = end + 1; // 更新start指针, 指向下一个单词的第一个字符
            end = start + 1; // 更新end指针(即使下一个单词只有一个字母, end指针也是指向单词后的空格)
        }
    } 
}

作者:ilovediana
链接:https://leetcode-cn.com/problems/reverse-words-in-a-string/solution/java-zi-fu-chuan-de-duo-chong-cao-zuo-xi-epov/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值