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

Posted bulangman277

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
    
;

以上是关于Leetcode 151.翻转字符串里的单词的主要内容,如果未能解决你的问题,请参考以下文章

5-104-(LeetCode- 151) 翻转字符串里的单词?

[LeetCode] 151. 翻转字符串里的单词

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

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

leetcode-151-翻转字符串里的单词

leetcode151. 翻转字符串里的单词