图论学习3 c++ 动态规划

使用c++设计一个自动校正英文拼写错误的程序

cpp 复制代码
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <unordered_map>

// 用于纠正拼写错误的函数,基于 Levenshtein 距离
std::string correctWord(const std::string& word, const std::vector<std::string>& dictionary) {
    if (std::find(dictionary.begin(), dictionary.end(), word) != dictionary.end()) {
        return word; // 如果单词已在字典中,直接返回
    }

    std::string bestMatch = word;
    int minDistance = std::numeric_limits<int>::max();

    // 遍历字典,找到最接近的匹配
    for (const auto& dictWord : dictionary) {
        int distance = levenshteinDistance(word, dictWord);
        if (distance < minDistance) {
            minDistance = distance;
            bestMatch = dictWord;
        }
    }

    return bestMatch; // 返回纠正后的单词
}

// 计算两个字符串之间的 Levenshtein 距离
int levenshteinDistance(const std::string& s1, const std::string& s2) {
    std::vector<std::vector<int>> dp(s1.length() + 1, std::vector<int>(s2.length() + 1, 0));

    for (int i = 0; i <= s1.length(); i++) {
        for (int j = 0; j <= s2.length(); j++) {
            if (i == 0) {
                dp[i][j] = j; // 初始化第一行
            } else if (j == 0) {
                dp[i][j] = i; // 初始化第一列
            } else if (s1[i-1] == s2[j-1]) {
                dp[i][j] = dp[i-1][j-1]; // 字符相同,无额外代价
            } else {
                dp[i][j] = 1 + std::min({dp[i-1][j], dp[i][j-1], dp[i-1][j-1]}); // 选择最小代价
            }
        }
    }

    return dp[s1.length()][s2.length()]; // 返回最终的 Levenshtein 距离
}

int main() {
    std::vector<std::string> dictionary = {"hello", "world", "programming", "computer", "algorithm"};
    std::string input;
    std::cout << "请输入一个单词:";
    std::cin >> input;
    
    std::string corrected = correctWord(input, dictionary);
    std::cout << "纠正后的单词:" << corrected << std::endl;

    return 0;
}

算法思想:

  1. 字典匹配:首先检查输入的单词是否已经在字典中。如果在,就不需要校正。
  2. 最小编辑距离:如果单词不在字典中,我们使用Levenshtein距离(编辑距离)算法来找到最相似的单词。编辑距离衡量了将一个字符串转换为另一个字符串所需的最少单字符编辑(插入、删除或替换)次数。
  3. 动态规划:Levenshtein距离的计算使用了动态规划方法,这能够有效地解决这个问题,避免重复计算。
  4. 选择最佳匹配:遍历整个字典,找到编辑距离最小的单词作为校正结果。
相关推荐
胡萝卜3.027 分钟前
数据结构初阶:排序算法(一)插入排序、选择排序
数据结构·笔记·学习·算法·排序算法·学习方法
scx201310041 小时前
20250814 最小生成树和重构树总结
c++·算法·最小生成树·重构树
xinzheng新政2 小时前
纸板制造制胶工艺学习记录4
学习·制造
weixin_307779133 小时前
VS Code配置MinGW64编译SQLite3库
开发语言·数据库·c++·vscode·算法
无聊的小坏坏3 小时前
拓扑排序详解:从力扣 207 题看有向图环检测
算法·leetcode·图论·拓扑学
我们从未走散4 小时前
JVM学习笔记-----类加载
笔记·学习
励志不掉头发的内向程序员4 小时前
STL库——string(类函数学习)
开发语言·c++
前路不黑暗@5 小时前
C语言:操作符详解(二)
c语言·开发语言·经验分享·笔记·学习·学习方法·visual studio
xiaoxiaoxiaolll5 小时前
金刚石基植入体新突破!Adv. Funct. Mater. 报道首例增材制造固态摩擦电能量收集器
学习
x.Jessica5 小时前
网络的构成元素
网络·学习·计算机网络