Every day a leetcode
题目来源:557. 反转字符串中的单词 III
解法1:模拟
将句子拆分,将每个单词逆置后,再拼接成新字符串。
这种做法需要使用额外存储空间。
代码:
void swap(char *a,char *b)
{
char temp=*a;
*a=*b;
*b=temp;
}
void reverse(char *word)
{
int left=0;
int right=strlen(word)-1;
while(left<=right)
{
swap(&word[left++],&word[right--]);
}
}
char * reverseWords(char * s){
int len=strlen(s);
char *ans=calloc(len+6,sizeof(char));
char split[2]=" ";
char *word=strtok(s,split);
while(word)
{
reverse(word);
memcpy(ans+strlen(ans),word,strlen(word));
strcat(ans,split);
word=strtok(NULL,split);
}
ans[len]='\0';
return ans;
}
结果:
解法2:双指针就地逆置
直接在原字符串上进行操作,避免额外的空间开销。
当找到一个单词的时候,我们交换字符串第一个字符与倒数第一个字符,随后交换第二个字符与倒数第二个字符……如此反复,就可以在原空间上翻转单词。
代码:
void swap(char *a,char *b)
{
char temp=*a;
*a=*b;
*b=temp;
}
char * reverseWords(char * s){
int len=strlen(s);
int i=0;
while(i<len)
{
int start=i;
//找当前单词的末尾
while(i<len && s[i]!=' ') i++;
int left=start;
int right=i-1;
while(left<right)
{
swap(&s[left++],&s[right--]);
}
//找下一个单词的开头
while(i<len && s[i] == ' ') i++;
}
return s;
}
结果: