[LeetCode]Reverse Words in a String

题目

Given an input string, reverse the string word by word.
For example,
Given s = “the sky is blue”,
return “blue is sky the”.

思路

整体思路,反转每个词,再反转整个句子。

方法1:考虑到给定s中会有一些多余空格,即开头和结尾的空格以及中间多个连续空格,第一步就是去除这些多余空格,确保词与词之间只有一个空格;第二步将每个词倒转,最后再将整个句子倒转。这里采用数组实现。

方法2(推荐!): 利用两个stack,一个表示单词,一个表示句子。当遇到非空格字符时放入单词stack;当遇到空格时将单词stack中的字符压入句子stack中(注意:单词此时已经逆序一次),然后仅添加一个空格。最后将句子stack依次输出,此时句子逆序。这里利用了stack”先进后出”的特性。

代码

方法1:

public class Solution {
    public static String reserveWord(String s) {
        char[] chars = removeDuplicateSpace(s);

        int begin = 0;
        int end = 0;

        for (; end < chars.length; end++) {
            if (chars[end] == ' ') {
                swap(chars, begin, end - 1);
                begin = end + 1;
                end = begin;
            }
        }
        swap(chars,begin,end-1);
        swap(chars,0,chars.length-1);

        return new String(chars);
    }

    private static void swap(char[] chars, int begin, int end) {
        char temp;
        while (begin < end) {
            temp = chars[begin];
            chars[begin] = chars[end];
            chars[end] = temp;
            begin++;
            end--;
        }
    }

    private static char[] removeDuplicateSpace(String s) {
        //一个或多个空格 正则
        String regex = "\\s+";
        String resultStr = s.trim().replaceAll(regex," ");
        System.out.println(resultStr);
        return resultStr.toCharArray();
    }
}

方法2:

public class Solution {
    public static String reserveWord(String s) {
        Stack<Character> wordStack = new Stack();
        Stack<Character> sentenceStack = new Stack();

        for (int i = 0; i < s.length(); i++) {
            if(s.charAt(i) == ' '&wordStack.size() > 0) {
                transfer(wordStack,sentenceStack);
                continue;
            }
            if(s.charAt(i) != ' ') {
                wordStack.push(s.charAt(i));
            }
        }

        StringBuilder sb = new StringBuilder();
        while(sentenceStack.size() > 0){
            sb.append(sentenceStack.pop());
        }
        return sb.toString();
    }

    private static void transfer(Stack<Character> wordStack, Stack<Character> sentenceStack) {
        sentenceStack.push(' ');
        while (wordStack.size() > 0) {
            sentenceStack.push(wordStack.pop());
        }
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值