LeetCode 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 }

自我感觉,使用栈的要方便些,而且时间复杂度上,栈的是更占优势的。

posted @ 2020-04-10 22:55  莴苣&  阅读(175)  评论(0编辑  收藏  举报