您的位置:首页 > 其它

LeetCode: Reverse Words in a String

2014-09-29 20:18 337 查看
题目:

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)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: