LeetCode 151. Reverse Words in a String

LeetCode 151. Reverse Words in a String (翻转字符串里的单词)

题目

链接

https://leetcode-cn.com/problems/reverse-words-in-a-string/

问题描述

给定一个字符串,逐个翻转字符串中的每个单词。

示例

输入: "the sky is blue"
输出: "blue is sky the"

提示

无空格字符构成一个单词。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

思路

造轮子,首先先去重首尾空格,然后处理中间的超过一个的空格,再转置。

需要转置两类,首先全体转置,之后每个单词转置,我在处理空格的时候处理了第一次转置,所以只需要对于每个单词转置即可。

复杂度分析

时间复杂度 O(n)
空间复杂度 O(n)

代码

Java


    public static String reverseWords(String s) {
        s = s.trim();
        s=remove(s);
        char[] c = s.toCharArray();
        int pre = 0;
        for (int i = 0; i < c.length; i++) {
            if (c[i] == ' ') {
                reverse(c, pre, i - 1);
                pre = i + 1;
            } else if (i == c.length - 1) {
                reverse(c, pre, i);
            }
        }

        return new String(c).trim();
    }

    public  static String remove(String s) {
        StringBuffer ss = new StringBuffer(s);
        StringBuffer n = new StringBuffer();
        if (ss.charAt(ss.length() - 1) != ' ') {
            n.append(ss.charAt(ss.length() - 1));
        }
        for (int i = ss.length() - 2; i >= 0; i--) {
            if (ss.charAt(i) == ' ' ) {
                if( ss.charAt(i + 1) != ' ') {
                    n.append(' ');
                }
            }else {
                n.append(ss.charAt(i));
            }
        }
        return n.toString();
    }

    public static void reverse(char[] ch, int s, int e) {
        while (s < e) {
            char t = ch[s];
            ch[s++] = ch[e];
            ch[e--] = t;
        }
    }
posted @ 2019-06-24 10:39  cheng102e  阅读(156)  评论(0编辑  收藏  举报