151反转字符串中的单词

从字符串的末尾往前处理,建立一个变量word_len保存每一个单词的长度,当 当前处理的字符为空格且word_len的长度不为0时说明已经读完一个单词了,此时将其加入答案字符串,并加入空格进行分隔。
这个时候发现最开始的一个单词会被忽略,这是因为这个时候字符串已经处理完了,不能再往前移动,干脆就单独处理。
又发现当原字符串以空格开头时会有一个多余空格,这是因为这个时候写的程序不能判定是否是最后一个单词,还会加入一个分格空格,本来想着重写的,但是还不如单独处理简单。
时间复杂度O(n),一次遍历即可处理完;空间复杂度O(n),需要一个额外的string。

class Solution {
public:
    string reverseWords(string s) {

        string ans;
        int len = s.size();
        int flag = len-1;
        int word_len = 0;

        while( flag>=0 )
        {
            // 这里当字符串开头没有空格时会忽略第一个单词
            if( s[flag] == ' ')
            {
                if(word_len != 0)//说明此时已经是存储了一个单词
                {
                    for(int i = flag + 1; i<=flag+word_len; i++)
                    {
                        ans += s[i];
                    }

                    ans += ' ';
                    word_len = 0;
                }
                flag--;
            }
               
            else 
            {
                word_len++;
                flag--;
            }
        }
            //处理最后一个单词(原字符串不以空格开头)
            if(word_len != ' ') 
            {
                for(int i = 0; i <= flag+word_len; i++)
                    {
                        ans += s[i];
                    }
            }
            
        //移除末尾的多余空格,原字符串以空格开头
        if( !ans.empty() && ans.back() == ' ')
            ans.pop_back();

        return ans;
    }
};

看了题解其实O(1)的空间复杂度也不难,思路就是先去除所有冗余的空格,然后翻转字符串,最后逐个翻转单词就行了。

posted @ 2025-02-17 21:04  名字好难想zzz  阅读(9)  评论(0)    收藏  举报