翻转字符串里的单词

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

示例:  

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

说明:

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

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

第一种方法:时间复杂度高,但空间复杂度低

public class Solution {
    public String reverseWords(String s) {
       
        if(s.length()==0)return "";
        String[] string=s.split("\s+");
        StringBuffer sb=new StringBuffer();
        for(int i=string.length-1;i>=0;i--){          
                sb.append(string[i]).append(" ");            
        }
        
        return sb.toString().trim();
    }
}

第二种方法:时间复杂度低,但空间复杂度为O(n)

public class Solution {
    public String reverseWords(String s) {
        if(s.length()==0)return s;
        char[] ch=s.toCharArray();
        char[] res=new char[ch.length];
        int len=helper(ch,ch.length-1,res,0,0);
        return new String(res,0,len);
    }
    private int helper(char[] ch,int r,char[] res,int l,int len){
        while(r>=0&&ch[r]==' '){
            r--;
        }
        if(r<0)return Math.max(0,len-1);
        int rigth=r;
        while(r>=0&&ch[r]!=' '){
            r--;
        }
        len+=rigth-r+1;
        for(int left=r+1;left<=rigth;left++,l++){
            res[l]=ch[left];
        }
        if(l<res.length){
            res[l++]=' ';
        }
        return helper(ch,r,res,l,len);
    }
}
原文地址:https://www.cnblogs.com/yihangZhou/p/10158449.html