解题思路:

  1. 整体思想是双指针法,因此定义一对快慢指针p1,p2.
  2. 首先寻找一个单词的末尾,因此当s[p1]不是字母时p1就要--,循环终止时只要p1将指向一个单词的末尾(还有单词的话),此时将用p2记录下这个单词的结尾。
  3. 继续寻找单词的开头,因此当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)