输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",则输出"student. a am I"。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/fan-zhuan-dan-ci-shun-xu-lcof
- 先处理字符串中 前置、中间、后置 多余的空格
- 再对字符串进行两次反转
- 一次整体反转,一次对每个单词进行单独反转
string reverseWords(string s) {
int n = s.size();
// 先处理前中后多余的空格
int fast = 0, slow = 0;
while (fast != n && s[fast] == ' ') // 先除去前置空格
{
++fast;
}
// base case,字符串为空 或 只有空格 的情况
if (fast == n)
{
return {};
}
while (fast != n)
{
while (fast != n && s[fast] != ' ') // 复制单词
{
s[slow++] = s[fast++];
}
while (fast != n && s[fast] == ' ') // 跳过中间的空格
{
++fast;
}
s[slow++] = ' '; // 中间只加一个空格
}
// 实际长度为 slow - 1,除去最后一个多加的空格
s = s.substr(0, slow - 1);
// 进行两次反转
reverse(s.begin(), s.end()); // 先整体反转一次
fast = 0;
slow = 0;
n = s.size();
while (fast < n) // 再对每个单词单独反转
{
while (fast != n && s[fast] != ' ')
{
++fast;
}
reverse(&s[slow], &s[fast]); // 此处用一般指针作为迭代器
++fast;
slow = fast;
}
return s;
}
注意:
reverse(&s[slow], &s[fast]); // 此处用一般指针作为迭代器
此处用一般指针作为迭代器,传入的是地址,实际不会真的去取s[fast],因此当 fast == n 时不会导致溢出