LeetCode 151. 反转字符串中的单词
题目描述
给定一个字符串 s
,你需要反转字符串中单词的顺序,同时去除多余的空格。
示例 1:
输入: "the sky is blue"
输出: "blue is sky the"
解题思路
- 去除多余空格:首先,我们需要去除字符串开头、结尾以及单词之间多余的空格。
- 反转整个字符串:然后,反转整个字符串。
- 反转每个单词:最后,反转每个单词,恢复单词的原始顺序。
C语言题解
c
#include <stdio.h>
#include <string.h>
// 去除多余空格
void removeExtraSpaces(char *s) {
int len = strlen(s);
int slow = 0; // 慢指针,用于构建新字符串
for (int fast = 0; fast < len; fast++) {
// 跳过空格
if (s[fast] != ' ') {
// 在单词之间添加一个空格
if (slow != 0) {
s[slow++] = ' ';
}
// 复制单词
while (fast < len && s[fast] != ' ') {
s[slow++] = s[fast++];
}
}
}
s[slow] = '\0'; // 添加字符串结束符
}
// 反转字符串
void reverseString(char *s, int start, int end) {
while (start < end) {
char temp = s[start];
s[start] = s[end];
s[end] = temp;
start++;
end--;
}
}
// 反转字符串中的单词
void reverseWords(char *s) {
// 1. 去除多余空格
removeExtraSpaces(s);
int len = strlen(s);
// 2. 反转整个字符串
reverseString(s, 0, len - 1);
// 3. 反转每个单词
int start = 0;
for (int i = 0; i <= len; i++) {
if (s[i] == ' ' || s[i] == '\0') {
reverseString(s, start, i - 1);
start = i + 1;
}
}
}
// 测试主函数
int main() {
char s[] = "the sky is blue";
printf("Original: \"%s\"\n", s);
reverseWords(s);
printf("Reversed: \"%s\"\n", s);
return 0;
}
代码逐行解释
#include <stdio.h>
和#include <string.h>
:包含标准输入输出库和字符串处理库。void removeExtraSpaces(char *s)
:定义一个函数removeExtraSpaces
,用于去除多余的空格。int slow = 0;
:慢指针,用于构建新字符串。for (int fast = 0; fast < len; fast++)
:快指针遍历字符串。if (s[fast] != ' ')
:如果当前字符不是空格,则处理。if (slow != 0)
:在单词之间添加一个空格。while (fast < len && s[fast] != ' ')
:复制单词。s[slow] = '\0';
:添加字符串结束符。
void reverseString(char *s, int start, int end)
:定义一个函数reverseString
,用于反转字符串的指定部分。while (start < end)
:交换字符,实现反转。
void reverseWords(char *s)
:定义一个函数reverseWords
,用于反转字符串中的单词。removeExtraSpaces(s);
:去除多余空格。reverseString(s, 0, len - 1);
:反转整个字符串。for (int i = 0; i <= len; i++)
:遍历字符串,反转每个单词。
int main()
:主函数,用于测试reverseWords
函数。char s[] = "the sky is blue";
:定义一个测试字符串。printf("Original: \"%s\"\n", s);
:打印原始字符串。reverseWords(s);
:调用reverseWords
函数反转字符串中的单词。printf("Reversed: \"%s\"\n", s);
:打印反转后的字符串。
运行结果
Original: "the sky is blue"
Reversed: "blue is sky the"
总结
通过去除多余空格、反转整个字符串以及反转每个单词,我们可以有效地实现字符串中单词顺序的反转。这种方法的时间复杂度为 O ( n ) O(n) O(n),其中 n n n 是字符串的长度。
CSDN博客链接 : LeetCode 151. 反转字符串中的单词 - C语言题解