淡泊明志 宁静致远
分类: C/C++
2007-07-20 12:23:07
以单词为单位的翻转字符串
原题:Write a function string reverse string word By word (String input) that reverses a string word by word.
For instance:
"The house is blue" -->
"blue is house The"
"Zed is
dead" -->"dead is Zed"
"All-in-one"
-->"All-in-one"
在不增加任何辅助数组空间的情况下,对于这个问题我们可以采用的办法就是:
办法一:
1、翻转整个字符串。
2、翻转每一个单词。
办法二:
1、翻转每一个单词。
2、翻转整个字符串。
办法一和二其实就是一个顺序的问题,并不影响算法的时间或空间复杂度。
下面给出代码:【本程序在DEV C++ 4.9.9.2 下编译通过】
#include
#define IS_PRINT(ch) ( (ch)
> 0x20 && (ch) < 0x7E ) // except space
char * ReverseEveryWord(char
*str);
char * ReverseWholeString(char
* str);
char * LR_Reverse(char *left,char *right);
int main(void)
{
char str[] =
"Hello word! **";
char *p =
str;
#if 0
ReverseWholeString(str);
ReverseEveryWord(str);
puts(str);
#else
ReverseEveryWord(str);
ReverseWholeString(str);
puts(str);
#endif
system("pause");
return 0;
}
char * ReverseEveryWord(char
*str)
{
char *right
= str,*left = str;
if(str ==
NULL)
return
NULL;
while(
!IS_PRINT(*right) )
right++;
while(*right)
{
left = right;
while(IS_PRINT(*right))
right++;
LR_Reverse(left,right-1);
while(*right
&& !IS_PRINT(*right))
right++;
}
return str;
}
char * ReverseWholeString(char
* str)
{
char *p =
str;
if(str ==
NULL)
return
NULL;
while(*p) p++;
p--;
LR_Reverse(str,p);
return str;
}
char * LR_Reverse(char *left,char *right)
{
char tt,*ret
= left;
if(left ==
NULL || right == NULL)
return
NULL;
while(left
< right)
{
tt = *left;
*left++ = *right;
*right-- = tt;
}
return ret;
}
chinaunix网友2010-06-27 10:30:07
感觉你这个有复杂, void main() { char a[]="i come from beijing." int i,j,k=0; for(i=strlen(a);i>=0;i--) { k++; if((a[i]!=' ')&&(i!=0)) continue; for(j=i;j<=k+i;j++) printf("%c",a[j]); } k=0; }