算法实现字符串匹配问题:从三个字符串中找出共有的最长部分。

来源:互联网 发布:淘宝商城森马男装 编辑:程序博客网 时间:2024/05/16 01:17


#include<iostream>

using namespace std;

//说明:从三个源字符串中找到共有的最长的字符串,并将返回最长的字符串的字符数
//输入:pSrcStr1、pSrcStr2、pSrcStr3 分别是指向三个源字符串的指针,
// lenOfSrcStr1、lenOfSrcStr2、lenOfSrcStr3 分别是三个源字符串的长度
//输出:pDstStr 是指向共有的字符串的指针,lenOfDstStr 共有字符串的长度
void common(const char *pSrcStr1, int lenOfSrcStr1, const char *pSrcStr2, 
int lenOfSrcStr2, const char *pSrcStr3, int lenOfSrcStr3, 
char *pDstStr, int *pLenOfDstStr)
{
//野指针检验,防止访问越界
if (NULL == pSrcStr1 || NULL == pSrcStr2 || NULL == pSrcStr3)
{
return;
}


*pLenOfDstStr = 0; //初始化共有的最长字符串长度为0


//循环比较找出最长的共有字符串
for (int iIndexOfStr1 = 0; iIndexOfStr1<lenOfSrcStr1;iIndexOfStr1++ )
{
for (int iIndexOfStr2 = 0; iIndexOfStr2<lenOfSrcStr2; iIndexOfStr2++)
{
//在第二个字符串中找到与第一个字符串中第iIndexOfStr1个字符相当的字符下标
if (pSrcStr1[iIndexOfStr1] == pSrcStr2[iIndexOfStr2])
{
for (int iIndexOfStr3 = 0; iIndexOfStr3<lenOfSrcStr3; iIndexOfStr3++)
{
//在第三个字符串中找到与第一个字符串中第iIndexOfStr1个字符相当的字符下标
if (pSrcStr1[iIndexOfStr1] == pSrcStr3[iIndexOfStr3])
{
int iEndOfStr1 = iIndexOfStr1;//第一个字符串中,最后一个共有字符串的下标
int iEndOfStr2 = iIndexOfStr2;//第二个字符串中,最后一个共有字符串的下标
int iEndOfStr3 = iIndexOfStr3;//第三个字符串中,最后一个共有字符串的下标


while (pSrcStr1[iEndOfStr1] == pSrcStr2[iEndOfStr2]
&& pSrcStr1[iEndOfStr1] == pSrcStr3[iEndOfStr3] 
&& iEndOfStr1<lenOfSrcStr1 && iEndOfStr2<lenOfSrcStr2
&& iEndOfStr3<lenOfSrcStr3)
{
iEndOfStr1++;
iEndOfStr2++;
iEndOfStr3++;
}

if (*pLenOfDstStr < (iEndOfStr1 - iIndexOfStr1))
{
*pLenOfDstStr = iEndOfStr1 - iIndexOfStr1;
int ilen = iEndOfStr1 - iIndexOfStr1;
int iIndex = 0;
while(ilen)
{
pDstStr[iIndex++] = pSrcStr1[iEndOfStr1-ilen];
ilen--;
}
}


iIndexOfStr1 = iEndOfStr1-1;//下一次匹配跳过比较过的字符
}
}
}
}
}
}


void main()
{
char cStr1[] = "abcdefghijkabcde";
char cStr2[] = "deabababcdabcdef";
char cStr3[] = "aabaabcdabf";


char cDstStr[20] = {0};
int iLongest = 0;


common(cStr1, 16, cStr2, 16, cStr3,11, cDstStr, &iLongest);
}