一种思路:时间复杂度,空间复杂度

#include 
#include 
#include 
//逆置相应段的元素
void reverse(char* str, int left, int right) {
    while (left < right) {
        char tmp = str[left];
        str[left] = str[right];
        str[right] = tmp;
        ++left;
        --right;
    }
}
int main() {
    char str[10000];
    gets(str);
    //数组长度
    int len = strlen(str);
    //清理多余非字母字符
    int slow = 0, fast = 0;
    //flag默认为1,表示空格已经被记录,直到出现新单词才变0,表示需要一个新空格
    int flag = 1;
    while (fast < len) {
        if (isalpha(str[fast])) {
            str[slow++] = str[fast];
            flag = 0;
        }
        else if (flag == 0) {
            str[slow++] = ' ';
            flag = 1;
        }
        ++fast;
    }
    str[slow] = '\0';
    //倒序字符串
    int cnt = strlen(str);
    reverse(str, 0, cnt-1);
    //逐个的单个的逆置单词
    int left = 0;
    int right = 0;
    flag = 1;
    //记录每个单词的开始下标和结束下标,再逆置两个下标之间的元素
    while (right <= cnt) {
        if (isalpha(str[right])) {
            ++right;
            flag = 0;
        }
        else {
            reverse(str, left, right - 1);
            ++right;
            left = right;
        }
    }
    puts(str);
    return 0;
}