#include<iostream>
#include<cstring>
using namespace std;
char *commonstring(char *str1, char *str2)
{
char *shorts, *longs;
char *sub;
if (str1 == NULL || str2 == NULL)
return NULL;
strlen(str1) <= strlen(str2) ? shorts = str1, longs = str2 : shorts = str2, longs = str1;
//测试 char *mm = strstr(longs, shorts);
// cout << mm << endl;
if (strstr(longs, shorts) != NULL)
return shorts;
sub = (char *)malloc(sizeof(char)*(strlen(shorts) + 1));
for (int i = strlen(shorts)-1 ; i > 0; i--)
{
for (int j = 0; j <= strlen(shorts) - i; j++) //检验0到strlen(shorts)长度的字符串
{
memcpy(sub, &shorts[j], i); //shorts里从j开始的i个字符复制到sub里
sub[i] = '\0';
if (strstr(longs, sub) != NULL)
return sub;
}
}
return NULL;
}
int main()
{
char str1[] = "abcdefghijk";
char str2[] = "bdfghik";
char *common = NULL;
common = commonstring(str1, str2);
cout << "the longest common string is: " << common<<endl;
return 0;
}
解法来自剑指offer。
分割线
我真是好久没看过书了,刚刚总感觉这解法不对,后来发现问题在于子串是连续的,对abcdefg,acd不能算是它的子串…然后这种解法思考上相对简单,O(N^2)的复杂度。以前在王道看KMP那是字符串匹配,不是子串。KMP的时间复杂度是O(N)