151. Reverse Words in a String

Given an input string, reverse the string word by word.
Example:  
Input: "the sky is blue",
Output: "blue is sky the".
Note:
* A word is defined as a sequence of non-space characters.
* Input string may contain leading or trailing spaces. However, your reversed string should not contain leading or trailing spaces.
* You need to reduce multiple spaces between two words to a single space in the reversed string.
Follow up: For C programmers, try to solve it in-place in O(1) space.






// correct 

public class Solution {
  
  public String reverseWords(String s) {
    if (s == null) return null;
    
    char[] a = s.toCharArray();
    int n = a.length;
    
    // step 1. reverse the whole string
    reverse(a, 0, n - 1);
    // step 2. reverse each word
    reverseWords(a, n);
    // step 3. clean up spaces
    return cleanSpaces(a, n);
  }
  
  void reverseWords(char[] a, int n) {
    int i = 0, j = 0;
      
    while (i < n) {
      while (i < j || i < n && a[i] == ' ') i++; // skip spaces
      while (j < i || j < n && a[j] != ' ') j++; // skip non spaces
      reverse(a, i, j - 1);                      // reverse the word
    }
  }
  
  // trim leading, trailing and multiple spaces
  String cleanSpaces(char[] a, int n) {
    int i = 0, j = 0;
      
    while (j < n) {
      while (j < n && a[j] == ' ') j++;             // skip spaces
      while (j < n && a[j] != ' ') a[i++] = a[j++]; // keep non spaces
      while (j < n && a[j] == ' ') j++;             // skip spaces
      if (j < n) a[i++] = ' ';                      // keep only one space
    }
  
    return new String(a).substring(0, i);
  }
  
  // reverse a[] from a[i] to a[j]
  private void reverse(char[] a, int i, int j) {
    while (i < j) {
      char t = a[i];
      a[i++] = a[j];
      a[j--] = t;
    }
  }
  
}





14 / 23 test cases passed.

public class Solution {
    public String reverseWords(String s) {
      if(s == null || s.length() == 0) return "";
      char[] array = s.toCharArray();
      reverse(array, 0, array.length - 1);
        
      int start = 0;
        
      for(int i = 0; i < s.length() ; i++){
        if( array[i] != ' ' && (i == 0 || array[i-1] == ' ')){
          start = i;
        }
        if(array[i] != ' ' && (i == s.length() - 1 || array[i+1] == ' ')){
          reverse(array, start, i);
        }
      }
      return new String(array);
    }
    private void reverse(char[] array, int start, int end){
      while( start < end){
        char tmp = array[start];
        array[start] = array[end];
        array[end] = tmp;
        start++;
        end--;
      }
    }
}

 

posted on 2018-11-08 15:46  猪猪&#128055;  阅读(94)  评论(0)    收藏  举报

导航