Leetcode 151.翻转字符串里的单词

题目描述

在这里插入图片描述

思路

首先读题干,发现初始字符串时以一个或多个空格将单词分隔开而组成的。
所以想到第一个问题,如何把字符串中的多个空格减少为一个空格,即每个单词间只存在一个空格。

然后继续看题干,返现需要以单词为单位,将整个字符串翻转。
所以想到第二个问题,如何以单词为单位将字符串翻转。
在这里插入图片描述

  1. 首先回答第一个问题:
    要想将空格减少,可以采用快慢指针法。
int slow=0,fast=0;

字符串中的空格分为三类:头部空格,内部空格,尾部空格。
对于头部空格:

//首先去除字符串首部的空格
while(s.size()>0&&fast<s.size()&&s[fast]==' ')
{
    
    
	fast++;
}

对于内部空格:

//然后去除字符串中部的空格
for(;fast<s.size();fast++)
{
    
    
	if(s[fast]==' '&&s[fast]==s[fast-1]&&fast-1>0)
	{
    
    
    	continue;
    }
    else
    {
    
    
     	s[slow]=s[fast];
        slow++;
    }
}

对于尾部空格:

//然后去除字符串末尾的空格
if(s[slow-1]==' '&&slow-1>0)
{
    
    
	s.resize(slow-1);
}
else
{
    
    
    s.resize(slow);
}
  1. 然后回答第二个问题

可以先调用reverse()函数将整个字符串翻转,然后再以空格为界限,分割每个单词,对于每个单词,调用reverse()函数。这样就将整个字符串翻转,且同时也将单词翻转了。

代码实现

class Solution {
    
    
public:
    void reverse(string &s,int start,int end)
    {
    
    
        for(int i=start,j=end;i<j;i++,j--)
        {
    
    
            swap(s[i],s[j]);
        }
    }

    void removespace(string &s)
    {
    
    
        int slow=0,fast=0;
        //首先去除字符串首部的空格
        while(s.size()>0&&fast<s.size()&&s[fast]==' ')
        {
    
    
            fast++;
        }
        //然后去除字符串中部的空格
        for(;fast<s.size();fast++)
        {
    
    
            if(s[fast]==' '&&s[fast]==s[fast-1]&&fast-1>0)
            {
    
    
                continue;
            }
            else
            {
    
    
                s[slow]=s[fast];
                slow++;
            }
        }
        //然后去除字符串末尾的空格
        if(s[slow-1]==' '&&slow-1>0)
        {
    
    
            s.resize(slow-1);
        }
        else
        {
    
    
            s.resize(slow);
        }
    }

    string reverseWords(string s)
    {
    
    
        cout<<s.size()<<endl;
        //首先去除多余的空格
        removespace(s);
        cout<<s.size()<<endl;
        //然后反转整个字符串
        reverse(s,0,s.size()-1);
        cout<<s.size()<<endl;
        //然后单独反转每个单词
        int left=0;
        for(int i=0;i<s.size();i++)
        {
    
    
            if(s[i]==' ')
            {
    
    
                reverse(s,left,i-1);
                left=i+1;
            }
            if(s[i]!=' '&&(i+1)==s.size())
            {
    
    
                reverse(s,left,i);
            }
        }
        return s;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_45847364/article/details/121744189