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)的空间复杂度也不难,思路就是先去除所有冗余的空格,然后翻转字符串,最后逐个翻转单词就行了。

浙公网安备 33010602011771号