Leetcode 第557题 反转字符串中的单词 III 题解

题目描述

给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。

示例:
输入:“Let’s take LeetCode contest”
输出:“s’teL ekat edoCteeL tsetnoc”

来源:力扣(LeetCode)
链接:LeetCode

题目分析

(1)由于java中String是不可变对象,因此要考虑在额外的字符数组或者StringBuilder上操作;
(2)用字符数组解时,由于要实现字符串中的单词反转,因此可以实现一个单词的反转方法,具体做法是交换单词的首尾字符,逐步向中间靠拢,完成反转;
(3)而字符串中的单词被空格所隔开,因此遇到空格时,即得到了一个单词,从而可对其调用反转函数,实现反转,而最后一个单词后面没有空格,因此要做特殊处理。

(4)用StringBuilder解时,考虑把每个单词分开,并记录每个单词开头,找到单词最后一个字符,从尾到头把字符添加到新字符串对象;
(5)由于每个单词间以空格隔开,因此每次处理完一个单词要手动添加一个空格,再处理下一个单词;
(6)最后一个单词后面不需要添加空格,可通过判断原来是否有空格从而决定是否添加空格,这样保持了一致性。

代码

class Solution {
    public String reverseWords(String s) {
        char []words = s.toCharArray();
        int start=0; //记录每个单词开头
        for(int i=0;i<s.length();i++){
            if(words[i]==' '){  //遇到空格时,即得到了一个单词
                reverse(words,start,i-1);
                start=i+1; //下一个单词的开始
            }
            if(i==s.length()-1){
                reverse(words,start,i);  
                //最后一个单词做特殊处理,其最右字符即为原字符串最后一个字符
            }
        }
        return new String(words);
    }
    private void reverse(char []word,int left,int right){
        while(left<right){
            char tmp = word[right];
            word[right]=word[left];
            word[left]=tmp;
            left++;
            right--;
        }
    }
}
//StringBuilder
class Solution {
    public String reverseWords(String s) {
        StringBuilder res = new StringBuilder();
        int i=0;
        while(i<s.length()){  
            int start = i;  //记录每个单词开头
            while(i<s.length() && s.charAt(i)!=' '){
                i++;  //找每个单词的结尾
            }
            for(int p=i-1;p>=start;p--){
                res.append(s.charAt(p));  //把单词加入到字符串
            }
            while(i<s.length() && s.charAt(i)==' '){
                 res.append(' ');  //原来如果有空格则添加空格
                 i++;
            }
            start=i;  //记录下一个单词开头
        }
        return res.toString();  //将StringBuilder对象转为String对象

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值