[LeetCode]Reverse Words in a String

来源:互联网 发布:js cron 表达式生成器 编辑:程序博客网 时间:2024/05/19 13:57

题目

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