LeetCode_Reverse Words in a String

Given an input string, reverse the string word by word.

For example,
Given s = "the sky is blue",
return "blue is sky the".

click to show clarification.

Clarification:
What constitutes a word?
A sequence of non-space characters constitutes a word.
Could the input string contain leading or trailing spaces?
Yes. However, your reversed string should not contain leading or trailing spaces.
How about multiple spaces between two words?
Reduce them to a single space in the reversed string.

题目如上所述,大意就是给定一个含有空格(空格数量不定)的字符串,要求将字符串中单词逆序,并且删除首尾空格,并将单词中间的空格缩成一个空格,

分析:问题看上去很简单,想法是从向后向前对字符串进行扫描,扫描到一个单词,就将扫描到的单词保存下来存到另外一个新申请的字符串中(考虑过降低空间复杂性,但是没想到),最后将原字符串和新申请的字符串交换。

两个主要需要解决的问题:

1)单词的识别方式(注意扫描顺序:从后向前):

我们记当前识别到的单词为newword,单纯的遇到空格(用□表示)是无法保证当前扫描到单词的,仔细考虑问题的各种情况:

a.两个空格连在一起“□”;

b.先空格后字符"a";

c.先字符后空格“□a”;

d.字符项链"aa";

在情况a:扫描到右侧第一个空格时,其实此时我们是没有识别到单词的,这时候这时候就需要判断newword的情况,此时newword为空,不需要左任何操作,继续扫描即可;

扫描到第二个空格时,同样没有识别到单词,与上面相同;

在情况b:扫描到第一个空格时与情况a的第一个空格相同;

扫描到a的时候,由于扫描到了字符,这时候要开始记录单词,然后继续向左扫描;

在情况c:扫描到a的时候,与情况b的a相同,继续向左扫描并记录单词;

扫描到空格时,表示当前单词已经结束,将当前单词添加到结果字符串中,并清空当前单词;

在情况d:扫描两个a时都与情况b的第a相同;

所以综上,可知,单词的识别方式:遇到字符,则更新当前单词,并继续扫描,遇到空格,判断当前字符串状态,做具体的操作即可。

2)由于所给定的原始字符串空格可能存在多种位置,而要求结果的字符串前后不可已存在多余的空格,程序中如何判断所有的单词都被识别完毕了呢?这个问题的解决方法我是没想到的,当然如果把没各识别到的单词都保存到一个单词数组中,就不需要考虑这个问题。但是这样要耗费一定的空间,同时我们也没法预料单词数组的大小,我的做法就是在执行翻转操作之前,先对所给字符串首尾进行去空格操作。

最终程序代码如下:

class Solution {
public:
	void reverseWords(string &s) {
		//判断是否为空字符串
		if (s=="")
		{
			return;
		}
		
		//清除首尾空格
		int i,j;
		i=0;
		j=s.length()-1;
		while (i<=s.length()-1)
		{
			if (s[i]==' ')
			{
				i++;
			}
			else
			{
				break;
			}
		}
		if (i==s.length())
		{
			s.clear();
			return;
		}
		while (j>=0)
		{
			if (s[j]==' ')
			{
				j--;
			}
			else
			{
				break;
			}
		}
		s=s.substr(i,j-i+1);


		string temStr;//临时变量存放当前被翻转的数组
		int currpos=s.length()-1;//当前遍历位置
		int len=0;//当前解析出的单词长度
		bool flag=false;//是否选出新单词标志
		string ttstr;//临时变量当前解析出的单词
		while (currpos>=0)
		{
			//获取字符串注意字符串不要超界
			while (currpos>=0&&s[currpos]!=' ')
			{
				flag=true;
				currpos--;
				len++;
			}

			if (flag)
			{
				ttstr=s.substr(currpos+1,len);
				temStr+=ttstr;
				if (currpos==-1)
				{
					break;
				}
				else
				{
					temStr+=' ';
				}
			}
			flag=false;
			len=0;
			currpos--;
		}
		s.clear();
		s+=temStr;
	}
};


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值