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

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;
}
...全文
213 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
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获得空格后的字符串的地址,
你然后按反序输出这些字符串即可。

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧