求两段中文语句的最长公共子串c语言代码
时间: 2024-04-30 20:18:43 浏览: 79
C语言求两个字符串的最长公共子串
5星 · 资源好评率100%
以下是基于动态规划的C语言代码实现,时间复杂度为O(m*n),其中m和n分别是两个中文语句的长度。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* LCS(char* str1, char* str2) {
int len1 = strlen(str1);
int len2 = strlen(str2);
int i, j;
int** dp = (int**)malloc(sizeof(int*) * (len1 + 1));
for (i = 0; i <= len1; i++) {
dp[i] = (int*)malloc(sizeof(int) * (len2 + 1));
memset(dp[i], 0, sizeof(int) * (len2 + 1));
}
int max_len = 0, max_end = 0;
for (i = 1; i <= len1; i++) {
for (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] > max_len) {
max_len = dp[i][j];
max_end = i - 1;
}
}
}
}
char* result = (char*)malloc(sizeof(char) * (max_len + 1));
strncpy(result, str1 + max_end - max_len + 1, max_len);
result[max_len] = '\0';
for (i = 0; i <= len1; i++) {
free(dp[i]);
}
free(dp);
return result;
}
int main() {
char str1[] = "以下是基于动态规划的C语言代码实现";
char str2[] = "动态规划的C语言代码实现,时间复杂度为O(m*n)";
char* result = LCS(str1, str2);
printf("最长公共子串为: %s\n", result);
free(result);
return 0;
}
```
阅读全文