
题目
解决代码及点评
/* 最大公共子字符串 */ #include "stdio.h" #include "string.h" #include "stdlib.h" int longest_common_substring(char *str1, char *str2) { int i, j, k, len1, len2, max, x, y; len1 = strlen(str1); len2 = strlen(str2); int **c = new int*[len1 + 1]; for (i = 0; i < len1 + 1; i++) c[i] = new int[len2 + 1]; for (i = 0; i < len1 + 1; i++) c[i][0] = 0;//第0列都初始化为0 for (j = 0; j < len2 + 1; j++) c[0][j] = 0;//第0行都初始化为0 max = -1; for (i = 1; i < len1 + 1; i++) { for (j = 1; j < len2 + 1; j++) { if (str1[i - 1] == str2[j - 1])//只需要跟左上方的c[i-1][j-1]比较就可以了 c[i][j] = c[i - 1][j - 1] + 1; else//不连续的时候还要跟左边的c[i][j-1]、上边的c[i-1][j]值比较,这里不需要 c[i][j] = 0; if (c[i][j]>max) { max = c[i][j]; x = i; y = j; } } } //输出公共子串 char s[1000]; k = max; i = x - 1, j = y - 1; s[k--] = '\0'; while (i >= 0 && j >= 0) { if (str1[i] == str2[j]) { s[k--] = str1[i]; i--; j--; } else //只要有一个不相等,就说明相等的公共字符断了,不连续了 break; } printf("最长公共子串为:"); puts(s); for (i = 0; i < len1 + 1; i++)//释放动态申请的二维数组 delete[] c[i]; delete[] c; return max; } int main(void) { char str1[1000], str2[1000]; printf("请输入第一个字符串:"); gets_s(str1); printf("请输入第二个字符串:"); gets_s(str2); int len = longest_common_substring(str1, str2); printf("最长公共连续子串的长度为:%d\n", len); system("pause"); return 0; }
代码下载及其运行
代码下载地址:http://download.csdn.net/detail/yincheng01/6704519
解压密码:c.itcast.cn
下载代码并解压后,用VC2013打开interview.sln,并设置对应的启动项目后,点击运行即可,具体步骤如下:
1)设置启动项目:右键点击解决方案,在弹出菜单中选择“设置启动项目”
2)在下拉框中选择相应项目,项目名和博客编号一致
3)点击“本地Windows调试器”运行
程序运行结果