打印兩個字符串中,最長的公共子串。不考慮並列最長的公共子串。
如:傳入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;
}
}
}
}
}