【问题标题】:Edit distance between two regular expression编辑两个正则表达式之间的距离
【发布时间】:2015-07-09 20:39:27
【问题描述】:

我在一次采访中遇到了这个问题:

给定两个正则表达式,计算它们之间的编辑距离。编辑距离定义为两个正则表达式分别生成的任意两个字符串之间的最小编辑距离。

正式地,我们正在寻找d(L1,L2) = min { d(x,y) | x from L1, y from L2 },其中L1L2 是两个正则表达式生成的语言。

我在面试时无法解决。即使现在我也不知道如何解决它。有什么想法吗?

我觉得这和http://www.spoj.com/problems/AMR10B/一样

【问题讨论】:

  • 我不确定我是否遵循,正则表达式生成一种语言,可以是无限的,而不是字符串,你如何定义两种语言之间的距离?你能举个例子吗?
  • 好的,我想我明白了 - 你的意思是 d(L1,L2) = min { d(x,y) | x from L1, y from L2 } 吗?
  • @amit:是的。我是这个意思。
  • 恕我直言,我们可以像解决两个字符串之间的最小编辑距离一样解决这个问题。

标签: regex string algorithm dynamic-programming


【解决方案1】:

有代表两种语言的有限状态机。假设第一种语言有状态 S[1], S[2], ..., S[N1] 和转换 c: S[i]->S[j] (意味着状态 i 在输入字符下进入状态 j c),以及 T[1], T[2], ... T[N2] 用于第二种语言(具有自己的转换集)。

现在,您可以构建加权多重图,其中节点是状态对,状态对之间的边 (S[i1], T[i2]) -> (S[j1], T[j2]) 如果有的话这四种情况都成立:

  • 有 c: S[i1] -> S[j1] 和 i2 = j2。重量为 1
  • 有 c: T[i2] -> T[j2] 和 i1 = j1。重量为 1
  • 有 c: S[i1] -> S[j1] 和 c: T[i2] -> T[j2]。它的权重为 0
  • 有 c: S[i1] -> S[j1] 和 d: T[i2] -> T[j2]。重量为 1

然后,找到从开始状态对到任何接受状态对的最低权重路径可以为您提供最小的编辑距离。

【讨论】:

  • 第二个语句中的意思是i1 = j1 吗?
猜你喜欢
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
  • 2017-08-11
  • 1970-01-01
  • 2020-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多