文本反转(单词位置反转)的高效算法。
比如这样一个字符串
" 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;
}