码迷,mamicode.com
首页 > 其他好文 > 详细

翻转字符串里的单词

时间:2018-12-21 19:36:08      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:split   --   包括   word   +=   pen   res   for   []   

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

示例:  

输入: "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);
    }
}

 

翻转字符串里的单词

标签:split   --   包括   word   +=   pen   res   for   []   

原文地址:https://www.cnblogs.com/yihangZhou/p/10158449.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!