C++实现编辑距离计算:小心下标、边界与状态转移!
```cpp #include <iostream> #include <cstring> using namespace std; const int MAXN = 2005; // 定义dp数组,dp[i][j]表示s的前i个字符到t的前j个字符的编辑距离 int dp[MAXN][MAXN]; int main() { char s[MAXN], t[MAXN]; // 读取两个字符串 cin >> s + 1 >> t + 1; int len_s = strlen(s + 1); int len_t = strlen(t + 1); // 初始化边界条件 // 当t为空字符串时,s到t的编辑距离就是删除s的所有字符 for (int i = 0; i <= len_s; i++) { dp[i][0] = i; } // 当s为空字符串时,s到t的编辑距离就是插入t的所有字符 for (int j = 0; j <= len_t; j++) { dp[0][j] = j; } // 状态转移 for (int i = 1; i <= len_s; i++) { for (int j = 1; j <= len_t; j++) { if (s[i] == t[j]) { // 如果当前字符相等,编辑距离不变 dp[i][j] = dp[i - 1][j - 1]; } else { // 否则,取插入、删除、替换操作中的最小值加1 dp[i][j] = min(min(dp[i - 1][j] + 1, dp[i][j - 1] + 1), dp[i - 1][j - 1] + 1); } } } // 输出结果 cout << dp[len_s][len_t] << endl; return 0; } ``` 我在以往的开发过程中,碰到过以下几点需要格外小心处理的地方: 1. 字符串的下标问题,这里使用 `s + 1` 和 `t + 1` 读取字符串,使得字符串下标从1开始,要注意初始化和状态转移时的下标范围。 2. 边界条件的初始化,`dp[i][0]` 和 `dp[0][j]` 的初始化要正确理解其含义。 3. 状态转移方程的理解和使用,特别是在当前字符不相等时,要正确选择插入、删除、替换操作中的最小值。 ######[AI写代码神器 | 571点数解答 | 2025-08-22 15:51:59]
- C++ 高效计算序列中递增三元组数量:从 O(n^2) 到 O(n log n) 的优化之路(DeepSeek | 742点数解答 | 2025-02-25 18:35:56)289
- C++ 求解序列中递增三元组数量:动态规划实现与复杂度分析(DeepSeek | 631点数解答 | 2025-02-25 18:40:05)230
- 易语言代码优化:自动出售物资子程序整合与优化全解析(DeepSeek | 2181点数解答 | 2025-07-23 10:26:29)214
- Android 课程作业考试管理 APP 开发:全功能实现与上线优化之路(GPT | 84点数解答 | 2024-12-14 13:46:35)277
- Android 学生学习管理 APP:功能完备开发全攻略(字节豆包 | 30点数解答 | 2024-12-14 13:47:04)237
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)345
- C 语言实现:从字符串查找指定字符,附代码及注意要点(字节豆包 | 262点数解答 | 2024-12-14 23:42:54)128
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)313
- Matlab 实现遗传算法求解图最短路径:参数设置与关键操作解析(字节豆包 | 128点数解答 | 2024-11-25 02:48:03)186
- MATLAB代码:修正遗传算法初始化种群代码,解决潜在错误(字节豆包 | 360点数解答 | 2024-11-25 02:48:49)196
- C++代码实现计算骑行总时间及详细解析(字节豆包 | 460点数解答 | 2026-03-03 19:51:23)19
- C++ 代码实现自定义运算 x@y = x² + y² - xy 及 x@(x+y) 计算(DeepSeek | 215点数解答 | 2025-12-13 15:08:14)70