文本反转(单词位置反转)的高效算法。

cxf1976 2004-12-25 01:14:20
比如这样一个字符串
" This is a book "
转换为
" book a is This "

求教各位,有没有高效算法。

我自己的两个普通算法,算法二比算法一慢一倍。
bool ReverseString1(char* str)
{
//方法一:使用一个临时数组,O(n^2)
if ( !str ) return false;

int nLength = strlen(str);

char *strTemp = new char[nLength+1];
if ( !strTemp ) return false;
memset(strTemp, ' ', nLength);
strTemp[nLength] = 0;

int nStart = 0;
int nStrLen = 0;
bool bIsBlank = false;
for (int i=0; i<nLength; i++)
{
for(int j=nStart; j<nLength+1; j++)
{
if (*(str+j)==' ' || j==nLength)
{
if ( !bIsBlank )
{
bIsBlank = true;
nStrLen = j - nStart;
strncpy(strTemp+nLength-j, str+nStart, nStrLen);
nStart += (nStrLen+1);
}
else
nStart++;
}
else
bIsBlank = false;
}
}
strcpy(str, strTemp);

if ( strTemp ) delete strTemp;

return true;
}

bool ReverseString2(char* str)//把每个跳变的位置记下来O(n)
{
if ( !str ) return false;

int nLength = strlen(str);

bool bIsBlank = true;
int nStrNum = 0;
for (int i=0; i<nLength; i++)//O(n)
{
if (*(str+i)!=' ')
{
if ( bIsBlank )
{
bIsBlank = false;
nStrNum++;
}
}
else
bIsBlank = true;
}

int* Pos = new int[nStrNum*2];//跳变数最大等于二倍的单词个数
memset(Pos, 0, nStrNum*2*sizeof(int));

int nStart = 0;
int nStrLen = 0;
int nIndex = 0;
bIsBlank = false;
for (i=0; i<nLength; i++)//O(n)
{
if (*(str+i)!=' ')
{
if ( bIsBlank || i==nLength-1)
{
bIsBlank = false;
Pos[nIndex++] = i;
}
}
else
{
if ( !bIsBlank && i!=0)
{
Pos[nIndex++] = i;
}
bIsBlank = true;
}
}

char *strTemp = new char[nLength+1];
if ( !strTemp ) return false;
memset(strTemp, ' ', nLength);
strTemp[nLength] = 0;
for(i=0; i<nIndex-1; i++)//O(n)
{
int nLen = Pos[i+1]-Pos[i];
if ( i==nIndex-2 )
nLen++;

strncpy(strTemp+nLength-Pos[i+1], str+Pos[i], nLen);
}

strcpy(str, strTemp);

delete strTemp;
delete Pos;

return true;
}
...全文
74 点赞 收藏 2
写回复
2 条回复
cxf1976 2004年12月26日
哪个函数确实不错。如果考虑算法的问题,就不该用那个函数了。
回复 点赞
I_Love_CPP 2004年12月25日
其实没有这么麻烦的,假如你知道下面这个函数的用法的话:
Find the next token in a string.

char *strtok(
char *strToken,
const char *strDelimit
);
Parameters
strToken
String containing token or tokens.
strDelimit
Set of delimiter characters.

Return Value(注意这儿)
Returns a pointer to the next token found in strToken. They return NULL when no more tokens are found. Each call modifies strToken by substituting a NULL character for each delimiter that is encountered.

strtok可以把字符串按空格分成不同的字符串,
而且strtok获得空格后的字符串的地址,
你然后按反序输出这些字符串即可。
回复 点赞
发动态
发帖子
VC/MFC
创建于2007-09-28

7889

社区成员

42.1w+

社区内容

VC/MFC相关问题讨论
社区公告
暂无公告