【LeetCode】 Reverse Words in a String

要求:in-place,extra space o(1)

【我的想法是】

1.先将收尾多余的空格去掉;

2. 遍历一次字符串,我要做两件事:

a)每识别出一个单词,就把这个单词reverse. 比如:我识别出apple,就reverse成elppa;

b)去掉两个单词之间的多余空格:如果识别出空格,就把该空格后面多余的空格删掉

3. 将整个字符串reverse一下。


举例说来:s="  You are the    apple of    my eye  "

第二步做完是:s=“uoY era eht elppa fo ym eye”

第三步: s=“eye my of apple the are You”

class Solution {
public:
    void reverseWords(string &s) {
        int i=0,j,k;
	while(i<s.size()){ // move leading spaces
		if(s[i]==' ')
			s.erase(s.begin()+i);
		else break;
	}

	i=s.size()-1; // move trailing spaces
	while(i>=0){
		if(s[i]==' '){
			s.erase(s.begin()+i);
			i--;
		}
		else break;
	}
    i=0;
	while(i<s.size()){ //reverse each word and remove extra spaces between two words;
		if(s[i]!=' '){
			int start=i;
			while(i<s.size()&&s[i]!=' ')
				i++;
			int end=i-1;
			for(j=start,k=end;j<=k;j++,k--)
				swap(s[j],s[k]);
		}
		else{
			while(i+1<s.size()&&s[i+1]==' ')
				s.erase(s.begin()+(i+1));
			i++;
		}
	}

	for(i=0,j=s.size()-1;i<=j;i++,j--) //reverse the whole string
		swap(s[i],s[j]);
    }
};



【运用已有的数据类型stringstream】

在discuss上看到的。用了stringstream,那么去空格,split各个单词都已经信手拈来,不必自己写。而且,思路很简洁易懂,就是把每个单词识别出来,insert到新生成的string中。不过呢,这算不算in-place?

总之,这种想法清晰简单。我蛮喜欢的。

void reverseWords(string &s){
	stringstream ss(s);
	string word="",out="";
	while(ss>>word){
		out=word+" "+out;
	}
	s=out.substr(0,out.length()-1); //减1的原因:out结尾多了一个空格
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值