leetcode[186]Reverse Words in a String II

Given an input string, reverse the string word by word. A word is defined as a sequence of non-space characters.

The input string does not contain leading or trailing spaces and the words are always separated by a single space.

For example,
Given s = "the sky is blue",
return "blue is sky the".

Could you do it in-place without allocating extra space?

 

class Solution {

public:

//无需额外空间开销

//反转整个字符串, 再反转每个单词

void reverseWords(string &s) {

    if(s.length()<1)return;

    int i=0,j=s.length()-1;

    //去开头结尾的空格

        while(s[i]==' '&&i<s.length())

        {

            i++;

            if(i==s.length())

            {

                s="";

                return;

            }

        }

        while(s[j]==' '&&j>=0)

        {

            j--;

            if(j<0)

            {

                s="";

                return;

            }

        }

        if(j-i<0)return;

        //截取除去开头结尾空格后的部分,并将其反转

        s=s.substr(i,j-i+1);

        reverse(s.begin(),s.end());

        //对每个以空格隔开的单词再次反转

    i=0,j=0;

    while(j<s.length())

    {

        while(s[j]!=' '&&j<s.length())j++;

        reverse(s.begin()+i,s.begin()+j);

        int tmp=j;

        while(s[j]==' '&&j<s.length())j++;

        if(tmp+1<s.length())s.erase(s.begin()+tmp+1,s.begin()+j);

        //注意此时s的长度已经变短,下边需要减去相应差值

        int shortL=j-tmp-1;

        j-=shortL;

        i=j;

    }

    return;

}

/**

需额外空间开销

void reverseWords(string &s) {

    if(s.empty())return;

    string tmp="";

    string str="";

    int i=0;

    while(i<s.length())

    {

        while(s[i]==' '&&i<s.length())i++;

        if(s[i]!=' '&&i<s.length())

        {

            while(s[i]!=' '&&i<s.length())tmp=s[i++]+tmp;

            str+=(tmp+' ');

            tmp="";

        }

    }

    reverse(str.begin(),str.end());

    int n=str[0]==' '?1:0;

    s=str.substr(n,str.size());

    return;

}

*/

};

 

你可能感兴趣的:(LeetCode)