翻转字符串里的单词

QUESTION:

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

示例 1:

输入: “the sky is blue” 输出: “blue is sky the” 示例 2:

输入: “ hello world! “ 输出: “world! hello” 解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。 示例 3:

输入: “a good example” 输出: “example good a” 解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

说明:

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

进阶:

请选用 C 语言的用户尝试使用 O(1) 额外空间复杂度的原地解法。

EXPLANATION:

这道题在leetcode里也是有的,所以算是比较常见的题目。
思路如下,采用双指针的形式,一个来表示一个单词的start,一个表示一个单词的end。这样就可以标记出一个单词,再将这个单词放在一个字符串的前面,就可以了。 算法:

  1. 先trims的前后空格
  2. 将start放在索引0位置,开始往后寻找,找到不是空格的地方,说明是一个单词的开始
  3. 将end放在start位置,开始往后寻找,找到不是字母的位置,说明单词结束
  4. 然后将这个单词放在sb的开头位置,并添加上空格
  5. 持续2-4步骤直到s的结尾
  6. 去掉结果后面的空格

    SOLUTION:

    class Solution {
     public String reverseWords(String s) {
         s = s.trim();
         char[] chars = s.toCharArray();
         int start = 0,end = 0;
         StringBuilder sb = new StringBuilder();
         while (end<chars.length){
             while (start<chars.length && chars[start]==' ') start++;
             end = start;
             while (end<chars.length && chars[end]!=' ') end++;
             sb.insert(0,s.substring(start,end)+" ");
             start = end;
         }
         return sb.toString().trim();
     }
    }