题目背景
本题要求实现一个功能,即给定一个字符串,将其中的单词翻转,同时去除多余的空格,使每个单词之间只有一个空格分隔,并且首尾没有空格。
解题思路
为了实现这一功能,我们将问题分解为几个步骤:
-
去除多余的空格:
- 遍历字符串,只保留必要的空格(单词之间的空格),同时将非空格字符移到字符串前面。
-
翻转整个字符串:
- 一旦整理完空格和单词,将整个字符串的字符顺序翻转。
-
翻转每个单词:
- 由于整个字符串已经被翻转过,每个单词也是倒序的,所以要再次对每个单词进行翻转,以恢复其原始顺序。
代码详解
1. reverse
函数:
- 这个函数用于翻转字符串中指定区间的字符。
- 输入参数包括字符串
s
和两个索引start
和end
,它将翻转从start
到end
的部分。 - 实现方法是使用两个指针,一个从前往后,一个从后往前,通过交换指针所指的字符,逐步向中间移动,直到两指针相遇。
void reverse(string &s, int start, int end){
for(int i = start, j = end; i < j; i++, j--) {
swap(s[i], s[j]);
}
}
2. removeExtraSpaces
函数:
- 这个函数用于删除字符串中的多余空格。
- 使用一个指针
k
来跟踪非空格字符应该复制到的位置。 - 遍历字符串,当遇到非空格字符时,如果不是第一个单词,则在单词前加一个空格;然后将单词的字符复制到前面。
void removeExtraSpaces(string &s){
int k = 0;
for(int i = 0; i < s.size(); i++)
if(s[i] != ' '){
if(k != 0) s[k++] = ' ';
while(i < s.size() && s[i] != ' ') s[k++] = s[i++];
}
s.resize(k); // 调整字符串大小以去除末尾未使用的部分
}
3. reverseWords
函数:
- 这个函数是主函数,它首先调用
removeExtraSpaces
来处理空格,然后翻转整个字符串。 - 接着,它遍历处理过的字符串,找到每个单词并调用
reverse
函数翻转每个单词。 - 最后,返回处理后的字符串。
string reverseWords(string s) {
removeExtraSpaces(s);
reverse(s, 0, s.size() - 1);
int start = 0;
for(int i = 0; i <= s.size(); i++)
if(i == s.size() || s[i] == ' '){
reverse(s, start, i - 1);
start = i + 1;
}
return s;
}