问题描述:
有人希望解释一下为什么这段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分别是两个输入字符串的长度。
希望以上解释能够帮助您理解这段代码的工作原理。如果还有其他问题,请随时提问。
球一个最佳答案谢谢啦!这对我非常重要! |