/*整体步骤:(先整体反转再局部反转:在原字符串上修改,用将满足要求的字符串覆盖原字符串)*/
//1反转链表,字符串中每个单词的位置已经颠倒过来了,
// 但单个单词中字符的顺序却改变了,之后要将每个单词位置调正;
//2三个指针,newdex:新字符串的下标;用start和end遍历每个单词:start指向每个单词的起始位置不 //动, 移动end指针去遍历;
//3找到第一个不为' '的字符就是第一个单词的起始位置,然后用end遍历到这个单词尾部,再将整 //个单词颠倒;
/*注意事项:*/
// ①注意要用新下标newdex去判断找到的start是不是第一个单词的起始位置,不是,要在覆盖动 // 作前,在新字符中插入一个' ',保证每个单词间一个空字符!
// ②注意循环覆盖动作的while循环条件:1、 end < n 2、s[end] != ' '
// ③注意反转单个单词时迭代器的起始和终止位置
// ④注意最后退出for循环时,要将原字符多余的部分删掉!
class Solution{ public: string reverseWords(string s) { /*反转整个字符串,使得每个单词整体的顺序满足要求*/ reverse(s.begin(),s.end()); int n = s.size(); /*新字符串的下标*/ int newdex = 0; for(int start = 0;start< n;start++){ /*找到不为空的字符*/ if(s[start] != ' '){ /*判断找到的这个不为空的字符是第一个单词的吗?不是,在新字符串中插入个空格!是,就忽略*/ if(newdex != 0)s[newdex++] =' '; /*用end去遍历整个单词*/ int end = start; /*循环将原字符串的字符赋给新字符串*/ while(end < n && s[end] != ' ')s[newdex++] = s[end++]; /*将新字符串中的单词顺序正过来*/ reverse(s.begin() + newdex - (end - start),s.begin() + newdex); /*更新start,去寻找下一个单词的位置*/ start = end; } } /*将原字符串中多余的部分删掉,只留覆盖后新字符串的部分*/ s.erase(s.begin() + newdex,s.end()); return s; } };