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".

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.
答案:

void reverseWords(string &s)
{
	string s0 ;
	unsigned int x1 = s.length();
	unsigned int* x = new unsigned int[x1 + 1]; //用来存储空格的位置
	unsigned int* xx = new unsigned int[x1 + 1]; //用来存储字母的相对位置
	unsigned int j = 0;
	for (unsigned int i = 0; i < x1 + 1; i++) //初始化数组
	{
		xx[i] = -1;
		x[i] = -1;
	}
	unsigned int m = 0;

	//去除多余空格
	for (unsigned int i = 0; i < x1; i++) 
	{
		if (s[i] != ' ')
			s0 += s[i] ;
		else if (i > 0 && s[i] == ' ' && s[i-1] == ' ')
		{
			continue;
		}
		else if (i == 0)
		{
			continue;
		}
		else
		{
			s0 += ' ';
		}
	}
	s0 = s0.substr(0, s0.find_last_not_of(' ')+1);

	//计算空格的位置
	unsigned int length0 = s0.length();
	for (unsigned int i = 0; i < length0 ; i++)
	{
		if (s0[i] == ' ')
		{
			x[m] = i;
			m++;
		}
		else if (i == length0 - 1)
			x[m] = i+1;
	}

	//计算字母的相对位置
	m = 0;
	int n = 0;
	for (unsigned int i = 0; i < length0 ; i++)
	{
		if (i < x[m])
		{
			xx[i] = length0 - (x[m]- n);
			n++;
		}
		else 
		{
			xx[i] = UINT_MAX;
			n = 0;
			m++;
		}
	}

	//进行调节
	m = 0;
	s = s0;
	for (unsigned int i = 0; i < length0 ; i++)
	{
		if (xx[i] != UINT_MAX)
			s[xx[i]] = s0[i];
		else if (x[m] != length0)
		{
			s[length0 - x[m] - 1] = ' ';
			m++;
		}
		
	}

	delete[] x;
	delete[] xx;

	return;
}



解析:

          首先要了解最普通的串是什么情况 : “     blue       is  sky   the    ”。像这种情况一般要进行4步

          1》去除多余空格。输出为 "the sky is blue"

           2》计算空格的位置。

           3》计算每个单词中每个字母在进行调节之后的相对位置。

           4》进行位置调节。

           加上用到的一个substr()函数,总体复杂度为5n,即:O(n)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值