题目描述
给你一个字符串 s ,逐个翻转字符串中的所有单词 。
单词是由非空格字符组成的字符串。s中使用至少一个空格将字符串中的单词分隔开。
请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串。
说明:
输入字符串 s 可以在前面、后面或者单词间包含多余的空格。
翻转后单词间应当仅用一个空格分隔。
翻转后的字符串中不应包含额外的空格。
输入:s = "the sky is blue"
输出:"blue is sky the"
解题思路
可以利用栈先进后出的特性,翻转单词。整体思路是从后往前遍历字符串s,遇到非空格入栈,遇到空格出栈。最后输出全部单词即可。需要注意的是空格的处理,单词间用一个空格隔开,字符串前后不能有空格。
解题代码
char * reverseWords(char * s)
{
int len = strlen(s);
if (0 == len)
{
return s;
}
char *stack = (char *)malloc(sizeof(char) * (len + 1));
char *ret = (char *)malloc(sizeof(char) * (len + 1));
int i, flag = 0, top = 0, index = 0;
for (i = len - 1; i >= 0; --i)
{
if (s[i] != ' ') // 入栈
{
stack[top++] = s[i];
flag = 1;
}
else // 出栈
{
while (top > 0)
{
ret[index++] = stack[--top];
}
if (1 == flag)
{
ret[index++] = ' ';
flag = 0;
}
}
}
if (0 == top)
{
if (index > 0)
{
index--; // 去掉最后的空格
}
}
while (top > 0) // 出栈最后一个单词
{
ret[index++] = stack[--top];
}
ret[index] = '\0';
strcpy(s, ret);
// malloc 的内存要free
free(ret);
free(stack);
return s;
}