【leetcode】反转字符串中的单词 III

 

/*方法一:使用额外空间
思路与算法

开辟一个新字符串。然后从头到尾遍历原字符串,直到找到空格为止,此时找到了一个单词,并能得到单词的起止位置。随后,根据单词的起止位置,可以将该单词逆序放到新字符串当中。如此循环多次,直到遍历完原字符串,就能得到翻转后的结果。*/


char
* reverseWords(char * s){ int len = strlen(s); char* Rets = (char*)calloc(len+1,sizeof(char)); int left=0,right=0,n=0; for (int i=0; i<len; i++) { if (s[i] == ' ') { right = i-1; for (int j=right; j>=left; j--) Rets[n++] = s[j]; Rets[n++] = ' '; left = i+1; } else if(i == len-1) { right = i; for (int j=right; j>=left; j--) Rets[n++] = s[j]; } } return Rets; }

 

/*方法二:原地解法
思路与算法

此题也可以直接在原字符串上进行操作,避免额外的空间开销。当找到一个单词的时候,我们交换字符串第一个字符与倒数第一个字符,随后交换第二个字符与倒数第二个字符…… 如此反复,就可以在原空间上翻转单词。

需要注意的是,原地算法在某些语言(比如 Java,JavaScript)中不适用,因为在这些语言中 String 类型是一个不可变的类型。*/


char* reverseWords(char* s) {
    int length = strlen(s);
    int i = 0;
    while (i < length) {
        int start = i;
        while (i < length && s[i] != ' ') i++;
        int left = start, right = i - 1;
        while (left < right) {
            char tmp = s[left];
            s[left++] = s[right], s[right--] = tmp;
        }
        while (i < length && s[i] == ' ') i++;
    }
    return s;
}

 

posted @ 2020-09-07 14:16  温暖了寂寞  阅读(135)  评论(0编辑  收藏  举报