/************************************************************************
* 求两个字符串的最大公共子字符串
* 日期 2014/5/16
************************************************************************/
#include <iostream>
#include <string.h>
using namespace std;
int common_sub_string(const char* str1, const char* str2, char* sub_str, int subArrayLen)
{
int maxlen = 0; //最长公共子字符串长度
if(str1 && str2 && strlen(str1) > 0 && strlen(str2) > 0 && sub_str && subArrayLen > 0)
{
int cnt; //两字符串相对滑动的偏移量
int s1start; //字符串str1的起始比较位置
int s2start; //字符串str2的起始比较位置
int idx; //比较偏移量
int curmaxlen; //当前公共子字符串长度
char *pcomsubstr; //当前公共字符串起始位置
int len1 = strlen(str1);
int len2 = strlen(str2);
int len = len1 + len2;
for(cnt = 1; cnt < len; cnt ++)
{
s1start = s2start = 0;
if(cnt < len1)
{
s1start = len1 - cnt;
}
else
{
s2start = cnt - len1;
}
curmaxlen = 0;
for(idx = 0; s1start + idx < len1 && s2start + idx < len2; idx ++)
{
if(str1[s1start + idx] == str2[s2start + idx])
{
curmaxlen ++;
}
else
{
if(maxlen < curmaxlen)
{
maxlen = curmaxlen;
curmaxlen = 0;
pcomsubstr = str1 + s1start + idx - maxlen;
}
}
}
if(maxlen < curmaxlen)
{
maxlen = curmaxlen;
pcomsubstr = str1 + len1 - maxlen;
}
//判断找到的子串是否刚好就是较短的那个源字符串,是的话,后面就不用比较了
if(maxlen == len1 < len2 ? len1 : len2)
{
break;
}
}
if(maxlen > 0 && maxlen < subArrayLen)
{
strncpy(sub_str, pcomsubstr, maxlen);
sub_str[maxlen] = '\0';
}
}
return maxlen;
}