图论学习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. 选择最佳匹配:遍历整个字典,找到编辑距离最小的单词作为校正结果。
相关推荐
草莓熊Lotso9 分钟前
《算法闯关指南:优选算法-双指针》--01移动零,02复写零
c语言·c++·经验分享·算法·leetcode
ajassi20004 小时前
开源 C++ QT Widget 开发(十五)多媒体--音频播放
linux·c++·qt·开源
Broken Arrows6 小时前
Linux学习——管理网络安全(二十一)
linux·学习·web安全
今天也要学习吖6 小时前
谷歌nano banana官方Prompt模板发布,解锁六大图像生成风格
人工智能·学习·ai·prompt·nano banana·谷歌ai
雁于飞6 小时前
vscode中使用git、githup的基操
笔记·git·vscode·学习·elasticsearch·gitee·github
鹅毛在路上了6 小时前
C++, ffmpeg, libavcodec-RTSP拉流,opencv实时预览
c++·opencv·ffmpeg
John_ToDebug7 小时前
定制 ResourceBundle 的实现与 DuiLib 思想在 Chromium 架构下的应用解析
c++·chrome·ui
rannn_1117 小时前
【Javaweb学习|实训总结|Week1】html基础,CSS(选择器、常用样式、盒子模型、弹性盒布局、CSS定位、动画),js(基本类型、运算符典例)
css·笔记·学习·html
小欣加油8 小时前
leetcode 面试题01.02判定是否互为字符重排
数据结构·c++·算法·leetcode·职场和发展