c语言leetcode第72题
时间: 2025-05-30 18:52:33 浏览: 15
### C语言解决LeetCode第72题的方法
LeetCode第72题名为“编辑距离”,其目标是计算两个字符串之间的最小操作数(插入、删除或替换),使得一个字符串可以转换成另一个字符串。以下是基于动态规划方法的C语言解决方案。
#### 动态规划原理
通过构建二维数组 `dp` 来存储子问题的结果,其中 `dp[i][j]` 表示将字符串 `word1[0..i-1]` 转换成 `word2[0..j-1]` 所需的最少操作数。状态转移方程定义如下:
- 如果字符相同,则无需额外操作:
\( dp[i][j] = dp[i-1][j-1] \)[^4]
- 如果字符不同,则取三种可能操作中的最小值加一:
\( dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1 \)[^4]
边界条件设置为当其中一个字符串为空时的操作数等于另一字符串长度。
#### 实现代码
下面是完整的C语言实现代码:
```c
#include <stdio.h>
#include <string.h>
#include <limits.h>
#define MIN(a, b) ((a) < (b) ? (a) : (b))
int minDistance(char* word1, char* word2) {
int m = strlen(word1);
int n = strlen(word2);
// 创建并初始化DP表
int dp[m+1][n+1];
for(int i = 0; i <= m; ++i){
for(int j = 0; j <= n; ++j){
if(i == 0){
dp[i][j] = j;
}
else if(j == 0){
dp[i][j] = i;
}
else{
if(word1[i-1] == word2[j-1]){
dp[i][j] = dp[i-1][j-1];
}
else{
dp[i][j] = MIN(MIN(dp[i-1][j], dp[i][j-1]), dp[i-1][j-1]) + 1;
}
}
}
}
return dp[m][n];
}
// 测试函数
void testMinDistance(){
char str1[] = "horse";
char str2[] = "ros";
printf("Minimum distance between '%s' and '%s': %d\n", str1, str2, minDistance(str1, str2));
}
```
上述代码实现了动态规划求解过程,并提供了测试样例验证功能[^4]。
#### 时间与空间复杂度分析
该算法的时间复杂度为 O(m*n),其中 m 和 n 分别表示输入字符串 `word1` 和 `word2` 的长度。由于使用了二维数组保存中间结果,因此空间复杂度同样为 O(m*n)。如果需要优化内存占用,可以通过仅保留两行数据的方式降低至线性级别的空间需求。
阅读全文
相关推荐










