Algorithm 如何找到字符串和语言之间的编辑距离/levenshtein距离?

Algorithm 如何找到字符串和语言之间的编辑距离/levenshtein距离?,algorithm,dynamic-programming,levenshtein-distance,edit-distance,Algorithm,Dynamic Programming,Levenshtein Distance,Edit Distance,字符串x与语言S的编辑距离是x与“最近”字符串y的编辑距离∈ 给定一个字符串x∈{0,1,…,9,(,),+,-,*,/}*,我想找到一个有效的算法来计算x和简单算术表达式语言之间的编辑距离。我想我必须像在经典的编辑距离问题中那样使用动态规划,但在这种情况下,我不知道第二个字符串与第一个字符串进行比较。我应该以某种方式使用语言限制吗?构造语法图或语法树?多谢各位 注:简单算术表达式的语言S定义为: 作为正则表达式{1 | 2 |…| 9}{0 | 1 | 2 |…| 9}*| 0示例的每个字符

字符串x与语言S的编辑距离是x与“最近”字符串y的编辑距离∈ 给定一个字符串x∈{0,1,…,9,(,),+,-,*,/}*,我想找到一个有效的算法来计算x和简单算术表达式语言之间的编辑距离。我想我必须像在经典的编辑距离问题中那样使用动态规划,但在这种情况下,我不知道第二个字符串与第一个字符串进行比较。我应该以某种方式使用语言限制吗?构造语法图或语法树?多谢各位

注:简单算术表达式的语言S定义为:

  • 作为正则表达式{1 | 2 |…| 9}{0 | 1 | 2 |…| 9}*| 0示例的每个字符串都属于S
  • 如果x∈ S然后(x)∈
  • 如果x,y∈ 然后x+y,x-y,x*y,x/y∈

我的直觉是某种贪婪算法应该给出正确的答案;i、 e.尝试解析表达式,每次出现解析错误时,只需删除意外符号或相应地插入预期符号即可。棘手的情况似乎类似于
1(3)
,其中
是一个意外的符号,但我们需要向前看,知道是否最好删除
或insert
+
。两次通过的算法应该能够通过首先计算括号来解决这个问题,但我不确定如何证明它给出了真正的最小编辑次数。我的直觉是某种贪婪算法应该给出正确的答案;即尝试解析表达式,每次出现解析错误时,j必须删除意外符号或相应地插入预期符号。棘手的情况似乎类似于
1(3)
,其中
是意外符号,但我们需要向前看,以了解是否最好删除
或insert
+
。两遍算法应该能够通过首先计算括号来处理这个问题,但我不确定如何证明它给出了真正的最小编辑次数。