问题描述:
有人希望解释一下为什么这段C/C++代码可以找到最长公共子字符串。
- #include <stdio.h>
- #include <string.h>
- #include <ctype.h>
- void findCommonSubstring(const char *str1, const char *str2) {
- int len1 = strlen(str1);
- int len2 = strlen(str2);
- int maxLen = 0; // 用于记录最长公共子字符串的长度
- int endIndex = 0; // 用于记录最长公共子字符串的结束索引
- // 创建一个二维数组,用于存储子问题的解
- int dp[len1 + 1][len2 + 1];
- // 初始化数组,将所有元素都设置为0
- for (int i = 0; i <= len1; i++) {
- for (int j = 0; j <= len2; j++) {
- dp[i][j] = 0;
- }
- }
- // 使用动态规划填充二维数组
- for (int i = 1; i <= len1; i++) {
- for (int j = 1; j <= len2; j++) {
- if (str1[i - 1] == str2[j - 1]) {
- dp[i][j] = dp[i - 1][j - 1] + 1;
- if (dp[i][j] > maxLen) {
- maxLen = dp[i][j];
- endIndex = i - 1;
- }
- }
- }
- }
- // 输出最长公共子字符串
- if (maxLen > 0) {
- printf("最长公共子字符串: ");
- for (int i = endIndex - maxLen + 1; i <= endIndex; i++) {
- printf("%c", str1[i]);
- }
- printf("\n");
- } else {
- printf("没有公共子字符串\n");
- }
- }
- int main() {
- char str1[100], str2[100];
- unsigned int i;
- printf("请输入第一个字符串(仅含字母):");
- scanf("%s", str1);
- printf("请输入第二个字符串:");
- scanf("%s", str2);
- findCommonSubstring(str1, str2);
- return 0;
- }
复制代码
请解释一下这段代码的工作原理。
解决方案:
这段代码使用动态规划算法来查找两个字符串的最长公共子字符串。以下是代码的工作原理的详细解释:
1. 首先,函数
findCommonSubstring接收两个字符串
str1和
str2作为输入参数。
2. 程序使用
strlen函数获取两个字符串的长度
len1和
len2。
3. 创建一个二维数组
dp,大小为
(len1 + 1) × (len2 + 1),用于存储子问题的解。数组
dp的每个元素
dp[i][j]表示以
str1[i-1]和
str2[j-1]结尾的最长公共子字符串的长度。
4. 初始化数组
dp,将所有元素都设置为0。
5. 使用动态规划填充二维数组
dp。遍历字符串
str1和
str2的所有字符,如果当前字符相等(即
str1[i-1] == str2[j-1]),则说明可以将当前字符加入到最长公共子字符串中,因此更新
dp[i][j] = dp[i-1][j-1] + 1。
6. 在填充过程中,记录最长公共子字符串的长度
maxLen和结束索引
endIndex。如果当前计算得到的最长公共子字符串长度大于之前记录的
maxLen,则更新
maxLen和
endIndex。
7. 最后,根据最长公共子字符串的长度和结束索引,输出结果。如果最长公共子字符串的长度大于0,则输出最长公共子字符串;否则,输出"没有公共子字符串"。
这个算法的时间复杂度为O(len1 × len2),其中
len1和
len2分别是两个输入字符串的长度。
希望以上解释能够帮助您理解这段代码的工作原理。如果还有其他问题,请随时提问。
球一个最佳答案谢谢啦!这对我非常重要!

