/*方法一:使用额外空间
思路与算法
开辟一个新字符串。然后从头到尾遍历原字符串,直到找到空格为止,此时找到了一个单词,并能得到单词的起止位置。随后,根据单词的起止位置,可以将该单词逆序放到新字符串当中。如此循环多次,直到遍历完原字符串,就能得到翻转后的结果。*/
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;
}