LeetCode 151. 翻转字符串里的单词
151. 翻转字符串里的单词
难度中等
给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入: "the sky is blue
" 输出: "blue is sky the
"
示例 2:
输入: " hello world! " 输出: "world! hello" 解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: "a good example" 输出: "example good a" 解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
说明:
- 无空格字符构成一个单词。
- 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
- 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
进阶:
请选用 C 语言的用户尝试使用 O(1) 额外空间复杂度的原地解法。
思路:这道题可以使用栈来解决,同样也可以不使用栈来解决,至于用哪种,嗯。。还得看怎么选择。这道题的题目不难理解,难就难在处理特殊情况,下面,给大家展示两组代码。
(1)没有使用栈的:
1 char * reverseWords(char * s){ 2 int i,j,k=0,flag=0,count=0; 3 for(i=0;i<strlen(s);i++){ 4 if(s[i]==' '){ 5 count++; 6 } 7 } 8 if(count==0){ 9 return s; 10 } 11 if(count==strlen(s)||strlen(s)==0){ 12 s[0]='\0'; 13 return s; 14 } 15 if(strlen(s)==1){ 16 return s; 17 } 18 char* sr; 19 sr=(char*)malloc((strlen(s)+1)*sizeof(char)); 20 for(i=strlen(s)-1;s[i]==' ';i--); 21 for(;i>=0;i--){ 22 if(s[i]==' '){ 23 flag++; 24 }else{ 25 flag=0; 26 } 27 if(flag==1){ 28 for(j=i+1;s[j]!=' '&&s[j]!='\0';j++){ 29 sr[k++]=s[j]; 30 } 31 sr[k++]=' '; 32 } 33 } 34 if(s[0]==' '){ 35 for(i=k;sr[k]==' ';i--); 36 sr[i-1]='\0'; 37 return sr; 38 } 39 40 for(i=k,j=0;s[j]!=' ';j++,i++){ 41 sr[i]=s[j]; 42 } 43 sr[i]='\0'; 44 return sr; 45 }
(2)使用栈的:
1 char * reverseWords(char * s){ 2 int len=strlen(s); 3 if(len==0) 4 return s; 5 char *res=(char *)malloc(sizeof(char)*(strlen(s)+1)); 6 char *stack=(char *)malloc(sizeof(char)*(strlen(s)+1)); 7 int i,top=0,count=0,flag=0; 8 for(i=len-1;i>=0;i--){ 9 if(s[i]!=' '){ 10 stack[top++]=s[i]; 11 flag=1; 12 } 13 if(s[i]==' '){ 14 while(top>0) 15 res[count++]=stack[--top]; 16 if(flag==1) 17 res[count++]=' '; 18 flag=0; 19 } 20 } 21 if(top==0){ 22 if(count>0) 23 count--; 24 } 25 while(top>0) 26 res[count++]=stack[--top]; 27 res[count]='\0'; 28 return res; 29 }
自我感觉,使用栈的要方便些,而且时间复杂度上,栈的是更占优势的。