题目:求两个字符串的最大公共子串.例如字符串A="abcdefg",字符串B="cdeab";
分析:从两个字符串的那个较短的字符串出发,求其全部子串,判断每一个子串是不是那个长串的子串,求子串过程本着由长到段的原则,这样可以保证第一次匹配到的子串就是最大的公共子串。
char* get_common_string(char* str1, char* str2)
{
assert(str1);
assert(str2);
int len1 = strlen(str1);
int len2 = strlen(str2);
//保证short_str指向端字符串,long_str指向长的字符串
char* short_str=str1;
char* long_str=str2;
if (len1 > len2)
{
short_str = str2;
long_str = str1;
}
//如果短串是长传的子串,那么最大公共串就是短串
if (strstr(long_str, short_str) != NULL)
{
return short_str;
}
len2 = strlen(short_str);//现在len2代表短串的长度
//sub_str是用来存储短串的各个子串的临时空间的
char* sub_str = (char*)malloc(sizeof(char)*len2);
//i是短串的所有可能长度,由于上面已经判断过短串自身了
//因此这里最长比短串小1开始
for (int i = len2 - 1; i > 0; i--)
{
//在短串中,从0下标开始找长度为i的子串,j的上限就是
//子串起始位置的下标,由于从j开始加上子串长