校验用户输入的单词,和正确的单词之间的差异(附代码实现)

114 阅读2分钟

简单的描述一下需求就是,校验用户输入的单词,和正确的单词之间的差异。

Simulator Screenshot - iPhone 14 Pro - 2023-12-24 at 12.02.29.png

测试用例:

  • 正确

afc7a8ceedaa435f870d075245d956a9~tplv-k3u1fbpfcp-jj-mark_3024_0_0_0_q75.png

  • 漏写

bee9cf1af6fc44f69fbcdd8c31fe0721~tplv-k3u1fbpfcp-jj-mark_3024_0_0_0_q75.png

  • 多写

732f79c9d7fa44bdb40d9018bf6cae36~tplv-k3u1fbpfcp-jj-mark_3024_0_0_0_q75.png

  • 错写

099b97a3e12c40c581ab9cc5d81d5a2c~tplv-k3u1fbpfcp-jj-mark_3024_0_0_0_q75.png

算法实现的思路如下:

  1. 使用Levenshtein距离算法计算用户输入单词与正确单词之间的编辑距离。编辑距离表示将一个字符串转换为另一个字符串所需的最少编辑操作次数(插入、删除、替换)。

  2. 对于每个编辑操作,根据操作的类型将相应的字符添加到NSMutableAttributedString对象中,并为该字符设置相应的颜色属性。

  3. 最后,将构建好的带有属性的文本对象返回。

  4. levenshteinDistance方法中,实现了Levenshtein距离算法。该算法使用动态规划的思想,通过填充一个二维数组distance来记录每个子问题的最小编辑距离。

  5. 首先,初始化distance数组的第一行和第一列,表示将一个字符串转换为空字符串所需的编辑次数。

  6. 然后,使用两层嵌套的循环遍历字符串的所有字符,比较字符是否相等,根据不同的情况更新distance数组中的值。

  7. 最后,根据填充好的distance数组,回溯出编辑操作的序列,并将每个操作类型、涉及的字符添加到一个数组中,最终返回该数组。

  8. 枚举类型Edit定义了四种编辑操作类型,用于表示编辑操作的种类。

通过以上步骤,实现了一个基于Levenshtein距离的单词检查功能,可以高亮显示用户输入单词中与正确单词不匹配的部分。

编辑距离

文章中用的案例代码: github.com/Yinjianhua4…