描述:给定一个字符串,逐个翻转字符串中的每个单词。
说明
单词的构成:无空格字母构成一个单词
输入字符串是否包括前导或者尾随空格?可以包括,但是反转后的字符不能包括
如何处理两个单词间的多个空格?在反转字符串中间空格减少到只含一个
样例:
Given s = “the sky is blue”,
return “blue is sky the”.
思路:先反转整个字符串,然后再反转字串。譬如先将“I am a student”反转为“tneduts a ma I”,然后再对每个字串(空格分割)反转一次。
新知识点:string t(s)//新建一个字符串t与已存在的s结构、参数完全一致;
p.find_first_not_of(” “)//返回字符串p第一个不是空格的字符的序号
p.find_last_not_of(” “)//返回字符串p最后一个不是空格的字符的序号
(1)erase(pos,n); 删除从pos开始的n个字符,比如erase(0,1)就是删除第一个字符
(2)erase(position);删除position处的一个字符(position是个string类型的迭代器)
(3)erase(first,last);删除从first到last之间的字符(first和last都是迭代器)
class Solution {
public:
/**
* @param s : A string
* @return : A string
*/
string reverseWords(string s) {
// write your code here
int len=s.size(),i,cnt=0,k=0,pos=0,cd;
/*创建两个字符串:t用来存放整体翻转后的字符串;p用来存放每个单词都翻转后的字符串*/
string t(s);
string p(s);
/*翻转整个字符串*/
for(i=0; i<len; i++){
t[i]=s[len-1-i];
}
/*翻转每个单词*/
for(i=0; i<len; i++)
{
/*依次翻转除最后一个单词之外的所有单词*/
if(t[i] == ' ')//每次检测到空格,表示一个完整的单词
{
cd=i-pos;//计算待翻转的单词的长度,存入cd
/*翻转单词*/
for(k=0; k<cd; k++)
p[cnt++]=t[i-k-1];
pos=i+1;//pos记下翻转后的单词的结尾的序号,之所以加1,是因为cd=i-pos中的i是每次检测到新单词的最后的空格的序号,而pos=i+1中的i是前一个单词的空格的序号,所以为了计算下一个待翻转的单词(即新单词)的长度,pos也得加1,使pos存放的是新单词第一个字符的序号。
p[cnt++]=' ';//翻转完毕后,将单词后面一个字符置为空格
}
/*翻转最后一个单词*/
if( i == (len-1))//因为最后一个单词后面没有空格,只有通过判断计数是否到达了(长度-1),若到达了,则表示最后一个单词完整了
{
cd=i-pos+1;//计算最后一个单词的长度,之所以加1,因为pos此时存放的是最后一个单词的第一个字符的序号,而此时的i存放的是len-1,即最后一个单词的最后一个字符的序号,i-pos表示的是最后一个单词的长度减1.
/*翻转最后一个单词*/
for(k=0; k<cd; k++,cnt++)
p[cnt]=t[i-k];
}
}
/*去掉字符串前后多余的空格*/
p.erase(0,p.find_first_not_of(" "));
p.erase(p.find_last_not_of(" ") + 1);
return p;
}
};
以上是自己编写的结果 ,后面参考网上,找到更优的解决算法。
思路:每个单词逐次翻转并同时存入新的字符串中。先将单词存入temp中,此时单词已经翻转,然后将temp中的字符串再进行翻转,恢复原状并写入新字符串ss中。
新知识点:s.length()//表示字符串s的长度
ss.push_back(’ ‘)//表示在字符串ss后加上一个字符,此处为空格
ss.append(temp)//表示在字符串ss后加上一个字符串,此处为字符串temp
string reverseWords(string s) {
// write your code here
string ss;
int i = s.length()-1;//此时i表示的字符串最后一个字符所在的序号
while(i>=0)
{
while(i>=0&&s[i] == ' ')//解决了首末字符为空格的情况,另外也去掉了两个单词之间的空格
{
i --;
}
if(i<0) break;//所有单词翻转结束,退出循环
if(ss.length()!=0)//当翻转一个单词结束后,在后面加上一个空格
ss.push_back(' ');
string temp ;//
for(;i>=0&&s[i]!=' ';i--)//将单词暂存至temp,此时单词是翻转后的状态
temp.push_back(s[i]);
reverse(temp.begin(),temp.end());//进行单词翻转,恢复原状
ss.append(temp);//将翻转后的单词存入字符串ss中
}
s=ss;
return s;
}