题目:给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入: “the sky is blue”
输出: “blue is sky the”
示例 2:
输入: " hello world! "
输出: “world! hello”
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: “a good example”
输出: “example good a”
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
(来源:力扣(LeetCode))
虽然题目的来源不同,但是其本质是一样的
思路:以题目中的示例1为例。要把最后一个blue放在第一个输出,其中经过了这些步骤:先把blue倒着拿出来,变成eulb,再倒着放入另一个结果数组中,其中,后两步操作可以理解为先入栈然后出栈,所以这道题可以使用栈实现,只要注意处理一下特殊情况即可。
代码:
char * reverseWords(char * s)
{
int len,top=-1,i,j=0,flag=0;
char *stack,*res;
len=strlen(s);
if(len==0)
return s;
stack=(char*)malloc(sizeof(char)*(len+1));
res=(char*)malloc(sizeof(char)*(len+1));
for(i=0;i<len;i++)
res[i]='\0';
for(i=len-1;i>=0;i--)//从末尾开始遍历
{
if(s[i]!=' ')
{
stack[++top]=s[i];
flag=1;/*遇到不是空格的字符,入栈;
是单词,标记为1*/
}
else
{
while(top!=-1)
{
res[j]=stack[top];
--top;
j++;
}//遇到空格,出栈,将结果保存在结果数组中
if(flag==1)
res[j++]=' ';//单词结尾空格
flag=0;
}
}
if(top==-1)/*当开头有空格时,结果后面会多出空格,题目
要求没有空格,需要在后面删去*/
{
if(j)//只输入一个空格时,不执行
j--;
}
while(top!=-1)/*当开头没有空格时,最后一个单词
无法输出,需要在后面补上*/
{
res[j]=stack[top];
--top;
j++;
}
res[j++]='\0';//字符串结尾
return res;
}