c语言两个字符串的最长子串
时间: 2024-09-26 13:06:19 浏览: 49
在C语言中,找到两个字符串之间的最长公共子串(非递归版本)可以使用动态规划(Dynamic Programming)的方法来解决。通常我们会创建一个二维数组或者称为"dp"表,其中每个元素dp[i][j]表示字符串1的前i个字符和字符串2的前j个字符的最长公共子串长度。
以下是一个简单的算法步骤:
1. 初始化dp数组,将第一行和第一列都设为0,因为单独一个字符不可能有共同子串。
2. 遍历两个字符串的每个字符,对于每一个dp[i][j],比较当前字符是否相同:
- 如果相同,则dp[i][j] = dp[i-1][j-1] + 1(当前子串长度加一)
- 如果不同,则dp[i][j] = max(dp[i-1][j], dp[i][j-1])(取两边的最大值作为新的子串长度)
3. 在遍历过程中,记录下最大值,即为两字符串的最长公共子串长度。
4. 根据这个最大值,回溯查找原字符串中对应的最长子串。
下面是一个简化的伪代码示例:
```c
int longestCommonSubstring(char* str1, char* str2, int len1, int len2) {
int dp[len1+1][len2+1];
int maxLength = 0;
int endIndex;
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] > maxLength) {
maxLength = dp[i][j];
endIndex = i - 1;
}
} else {
dp[i][j] = 0;
}
}
}
// 返回最长公共子串,从str1中截取endIndex+1到len1个字符
return str1 + endIndex - maxLength + 1;
}
```
阅读全文