图论学习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. 选择最佳匹配:遍历整个字典,找到编辑距离最小的单词作为校正结果。
相关推荐
孤寂大仙v4 分钟前
【Linux笔记】——线程同步条件变量与生产者消费者模型的实现
linux·c++·笔记
ai.Neo10 分钟前
牛客网NC276055:三根木棒能否组成三角形问题详解(ACM中的A题)
数据结构·c++·算法
じ☆ve 清风°29 分钟前
滑动窗口算法详解与C++实现
开发语言·c++·算法
苕皮蓝牙土豆34 分钟前
C++ map & multimap 容器:赋值、排序、大小与删除操作
开发语言·c++
虾球xz1 小时前
游戏引擎学习第293天:移动Familiars
c++·学习·游戏引擎
lichuangcsdn1 小时前
【springcloud学习(dalston.sr1)】Eureka服务端集群的搭建(含源代码)(二)
学习·spring cloud·eureka
名誉寒冰1 小时前
RPC框架源码分析学习(二)
qt·学习·rpc
孙同学_1 小时前
【C++】map和set的使用
开发语言·c++
wjm0410061 小时前
C++中的容器
开发语言·c++
脚大江山稳3 小时前
二进制与十进制互转的方法
c++