1. 程式人生 > >LeetCode151.翻轉字串裡的單詞

LeetCode151.翻轉字串裡的單詞

給定一個字串,逐個翻轉字串中的每個單詞。

示例:  

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

說明:

  • 無空格字元構成一個單詞。
  • 輸入字串可以在前面或者後面包含多餘的空格,但是反轉後的字元不能包括。
  • 如果兩個單詞間有多餘的空格,將反轉後單詞間的空格減少到只含一個。

進階: 請選用C語言的使用者嘗試使用 O(1) 空間複雜度的原地解法。

思路:自己實現了一個函式將字串拆分成不含空格以及不含空格字串的字串陣列,最後再將返回的字串陣列由尾到頭重新拼接。雖然也能通過,但是時間複雜度和空間複雜度比較高。

public class Solution {
    public String reverseWords(String s) {
         String res="";
        String str[]=spiltString(s);
        for(int i=str.length-1;i>0;i--){
            res+=str[i]+" ";
        }
        res+=str[0];
        return res;
    }
    /**
     * 將字串拆分成字串陣列
     * @param str
     * @return
     */
    public  String[] spiltString(String str){
        List<String> list=new LinkedList<String>();
        str=str.trim();//去掉首尾空格
        char s[]=str.toCharArray();
        String tmpStr="";
        for(int i=0;i<s.length;i++){
            if(s[i]!=' '){
                tmpStr+=s[i];
            }else{
                list.add(tmpStr);
                tmpStr="";//重新賦空串值
                while (s[i]==' '){
                    i++;//直到s[i]不等於空格
                    if(i>=s.length){
                        break;
                    }
                }
                i--;//
            }
        }
        list.add(tmpStr);
        return list.toArray(new String[list.size()]);
    }
}

在此,再分享一種耗時較少以及空間複雜度較低的一種演算法。

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

        return  sb.toString().trim();
    }
}