您的位置:首页 > 其它

LeetCode_Reverse Words in a String

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