解题思路:
- 整体思想是
双指针法
,因此定义一对快慢指针p1,p2. - 首先寻找一个单词的
末尾
,因此当s[p1]不是字母时p1就要--,循环终止时只要p1将指向一个单词的末尾(还有单词的话),此时将用p2记录下这个单词的结尾。 - 继续寻找单词的
开头
,因此当s[p1]为字母的时候就让p1--,最终p1+1指向该单词的开头,我们从p1+1遍历到p2,依次打印即可。
易错提醒
scanf函数不能接受带空格的字符串,所以要使用gets
函数
代码呈现
#include<stdio.h>
#include<ctype.h>
#include<string.h>
int main()
{
char s[10000];
gets(s);
int len = strlen(s);
int p1 = len - 1, p2 = len;
while(p1 >= 0)
{
while(p1 >= 0 && !isalpha(s[p1]))
p1--;
p2 = p1;
while(p1 >= 0 && isalpha(s[p1]))
p1--;
for(int i = p1 + 1; i <= p2; i++)
printf("%c", s[i]);
printf(" ");
}
return 0;
}
时间复杂度:O(n)
空间复杂度:O(1)