您的位置:首页 > 其它

4、给出一个函数复制两个字符串A和B,A的后几个和B的前几个字节重叠

2012-09-05 10:16 507 查看
//利用该进的KMP算法实现复制A和B,A的后几个和B的前几个字节重叠
//KMP算法
//求next数组
void nextCal(const char* str, int * next)
{
int length =strlen(str);
int j = 0, k = -1;
next[0]= k;
while(j < length - 1)
{
if(k == -1 || str[j] == str[k])
{
++k;
++j;
next[j] = k;
/*
//当str[j] == str[k]时,如果用str[k]比较
//还是不等还要继续找next[k], 不如这里直接给了
if(str[j] != str[k])
next[j] = k;
else
next[j] = next[k];
*/
}
else
k = next[k];
}
}
//KMP算法
int matchKMP(const char * strD, const char * strP)
{
int length = strlen(strP);
int lengthD = strlen(strD);
int * next = new int[length];
nextCal(strP, next);
showArr(next, length);
int posD = 0;
int posP = 0;
while(posD < lengthD && posP < length)
{
if(posP == -1 || strP[posP] == strD[posD])
{
posP++;
posD++;
}
else
posP = next[posP];
}
if(posP >= length)
return posD - length;
else
return -1;
}
//返回P中和D中重复的字节长度
int matchStr(const char * strD, const char * strP)
{
int lengthP = strlen(strP);
int lengthD = strlen(strD);
if(lengthP == 0)
return -1;
int * next = new int[lengthP];
nextCal(strP, next);

int posD = 0;
int posP = 0;
while(posD < lengthD)
{
if(posP == -1 || strP[posP] == strD[posD])
{
//全部匹配完成,但是posD未到头
if(posP >= lengthP - 1)
{
posP = next[posP];
continue;
}
posP++;
posD++;

}
else
posP = next[posP];
}
return posP;
}
//复制算法
char * catStrs(char * strA, char * strB, char *result, int size)
{
int repeatLength = matchStr(strA, strB);
int lengthA = strlen(strA);

strncpy_s(result, size, strA, lengthA - repeatLength);
result[lengthA - repeatLength] = '\0';

strcat_s(result, size, strB);
return result;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐