lintcode-->翻转字符串

给定一个字符串,逐个翻转字符串中的每个单词。

说明

 

  • 单词的构成:无空格字母构成一个单词
  • 输入字符串是否包括前导或者尾随空格?可以包括,但是反转后的字符不能包括
  • 如何处理两个单词间的多个空格?在反转字符串中间空格减少到只含一个

 

方法1:从后往前依次遍历源字符串src,每次遍历完一个单词后,直接将该单词整个拷贝到另一个字符串dst中,依次遍历原字符串,分别将每个独立的单词拷贝到dst中。

在拷贝字符串是先判断该字符串是否全是空格如果是则不拷贝。

 

实现:


class Solution {
public:
    /*
     * @param s: A string
     * @return: A string
     */
     
void *reverse(char *src, char *dst)  
{  
    char *p1, *p2;  
    if(src == NULL || dst == NULL)  
    {  
        return NULL;  
    }  
    //从src的最后一个字符开始遍历  
    p1 = src + strlen(src) - 1;  
    p2 = p1;  
    while (p1 != src)  
    {  
        if (*p1 == ' ')  
        {  
            int len = p2 - p1;//单词的长度 
            
            memcpy(dst, p1 + 1, len);  
            //每个单词的末尾加上一个空格  
            dst += len;  
            if(len>0)
                *dst++ = ' ';
 
            p1--;  
            p2 = p1;  
        }  
        else  
        {  
            //不断将p1向前移动  
            p1--;  
        }  
    }  
    //最后一次拷贝单词  
    int len = p2 - p1 + 1;  
    memcpy(dst, p1, len);  
    dst += len;  
    *dst++ ='\0';  
      
}  
     
    string reverseWords(string &s) {
        int i;
        int j;
        string cstr;
        char *str=(char*)calloc(1,s.length());
         char *dst=(char*)calloc(1,s.length());
        memcpy(str,s.c_str(),s.length());
        
        if(s.length()==0)
        return cstr.append("");
        
        reverse(str,dst);
      
        return cstr.append(dst);
    }
};

 


 方法2:先将每个单词分成独立的几部分,然后分别对它们进行翻转,返回将整个字符串进行翻转

 实现:

 1 class Solution {
 2 public:
 3     /*
 4      * @param s: A string
 5      * @return: A string
 6      */
 7      
 8 void reverse(char *str, int low, int hight) {
 9     while (low < hight) {
10         int temp;
11         temp = str[hight];
12         str[hight] = str[low];
13         str[low] = temp;
14         low++;
15         hight--;
16     }
17 }
18 
19 void space(char *str)
20 {
21     int i=0;
22     int j=0;
23     char *s=str;
24 
25     //去掉字符串头部的空格
26     while(str[i]!='\0')
27     {
28         if(str[i]!=' ')
29             break;
30         i++;
31     }
32 
33 
34     while(str[i]!='\0')
35     {
36         if(str[i]==' ')
37         {
38             s[j]=str[i];
39             while(str[i]==' ')
40                 i++;
41             j++;
42         }else
43         {
44             s[j]=str[i];
45             i++;
46             j++;
47         }
48     }
49     s[j]='\0';
50 } 
51      
52 string reverseWords(string &s) {
53         int i;
54         int j;
55         string cstr;
56         char *str=(char*)calloc(1,s.length());
57         memcpy(str,s.c_str(),s.length());
58         int len = strlen(str);
59         int num = 0;
60 
61         for (int i = 0; i <= len; i++) {
62            if (*(str + i) == ' ' || *(str + i) == '\0') {
63                 reverse(str, i - num, i - 1);
64                 num = 0;
65             } else {
66                 num++;
67             }
68         }
69         reverse(str, 0, len - 1);
70         space(str);
71          
72         return cstr.append(str);
73     }
74 };

 

posted on 2017-12-11 13:32  moon-zhu  阅读(485)  评论(0编辑  收藏  举报