描述:
打印两个字符串中,最长的公共子串。不考虑并列最长的公共子串。
如:传入str1 = "abcdef" 和 str2 = "bcdeyzcdef"
打印:"cdef"
思路:
从相对较短的字串中依次选择比上一次少一个字符的子串,然后,去较长的字串中查找(用strstr()函数)。
例如本题:
第一次:在str2中查找abcdef
第二次:在str2中查找abcde、bcdef
第三次:在str2中查找abcd、bcde、cdef
依次进行……
代码如下:
void printLongestPublicSubString(const char * str, const char * str2)
{
//以下两个变量是为了保证我们总是从较短的字串中截取字串去较长字串中查找
size_t len = (strlen(str) < strlen(str2))?strlen(str):strlen(str2);
size_t flag = (strlen(str) < strlen(str2))?0:1;
char * buf = (char *)malloc(sizeof(char) * len);
for (size_t i = len; i > 0; i--)
//该层循环控制从较短字串中截取的子串长度
{
memset(buf, 0, len);//每次查找都要清零,把之前赋的值清掉。
for (size_t j = 0; j <= len - i; j++)
//该层循环截取子串
{
for (size_t k = 0; k < i; k++)
//将要截取的子串取出来
{
if (flag)
*(buf+k) = *(str2+j+k);
else
*(buf+k) = *(str+j+k);
}
if (flag) {
if (strstr(str, buf)) {
printf("%s\n",buf);
return;
}
}else{
if (strstr(str2, buf)) {
printf("%s\n",buf);
return;
}
}
}
}
}