151. 翻转字符串里的单词

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

示例 1:

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

示例 2:

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

示例 3:

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

说明:

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

1、假如对单词之间的空格不做要求,可以先翻转单词,再翻转整个句子

class Solution {
   public String reverseWords(String str) {
       //假如str单词之间的空格为1 或者不要求对空格作操作
       String s = str.trim();
       int n = str.length();
       char[] chars = s.toCharArray();
       int i = 0,j = 0;
       while(j <= n){
           if(j == n || chars[j] == ' '){
               reverse(chars,i,j - 1);
               i = j + 1;
           }
           j++;
       }
       reverse(chars,0,n - 1);
       return new String(chars);
       
    }

    private void reverse(char[] c, int i, int j) {
        while (i < j)
            swap(c, i++, j--);
    }

    private void swap(char[] c, int i, int j) {
        char t = c[i];
        c[i] = c[j];
        c[j] = t;
    }
}

2、有要求,需要将单词之间的空格减小为1

class Solution {
   public String reverseWords(String str) {
       String s = str.trim();
       StringBuilder sb = new StringBuilder();
       int i = s.length() - 1;
       int j = i;
       while(i >= 0){
           while(i >= 0 && s.charAt(i) != ' ') i--;
           for(int k = i + 1;k <= j;k++){
               sb.append(s.charAt(k));
           }
           sb.append(' ');
           while(i >= 0 && s.charAt(i) == ' ' ) i--;
           j = i;
       }
       
       return new String(sb).trim();
       
    }
}
一回生,二回熟
原文地址:https://www.cnblogs.com/zzytxl/p/12692771.html