【反转字符串中的单词】
这个代码实现了字符串中单词顺序的反转,同时保持了每个单词内部的字符顺序。我来详细分析它的思路和工作原理:
思路分析
-
整体反转:
reverse(s.begin(), s.end());
- 首先将整个字符串反转,这样单词顺序就反过来了,但每个单词的字母也是反的
- 例如:“the sky is blue” → “eulb si yks eht”
-
逐个单词处理:
for(int i=0; i<n; i++) {if(s[i]!=' ') {// 处理单词} }
- 使用双指针法(
i
和j
)来识别和处理每个单词
- 使用双指针法(
-
单词间空格处理:
if(index!=0) s[index++]=' ';
- 如果不是第一个单词,先添加一个空格分隔
index
跟踪新字符串的写入位置
-
单词提取和反转:
int j=i; while(j<n && s[j]!=' ') s[index++]=s[j++]; reverse(s.begin()+index-(j-i), s.begin()+index);
j
指针找到单词结尾- 将单词复制到新位置
- 反转这个单词恢复原始顺序
-
调整指针:
i=j;
- 跳过已处理的单词
-
截断多余部分:
s.erase(s.begin()+index, s.end());
- 删除处理后多余的部分
class Solution {
public:string reverseWords(string s) {reverse(s.begin(),s.end());int n=s.size();int index=0;for(int i=0;i<n;i++){if(s[i]!=' ' ){if(index!=0)s[index++]=' ';int j=i;while(j<n&&s[j]!=' ')s[index++]=s[j++];reverse(s.begin()+index-(j-i),s.begin()+index);i=j;}}s.erase(s.begin()+index,s.end());return s;}
};