如何检查字符串是否可以使用某些规则获得?

时间:2016-11-22 11:27:50

标签: c++ string dynamic-programming cyk

自从我开始尝试找到这个问题的解决方案已经过去了一周,我最后读到了关于CYK算法的内容,但我无法理解它对我的帮助。

所以我开始使用某个字符串,让我们称之为 startString
我有一个特定的字符串,我想通过应用后面解释的规则,称为 stopString

-----------

现在让我们举个例子:

startString = "A"  
stopString = "2403"

此示例的规则如下:

A->BC  
B->D  
B->ED  
C->F  
C->FB  


E->0  
D->2  
D->3  
F->4  
E->1  

程序将采用上述输入并输出应用于从startString到stopString的最小转换列表, 可能 以下内容:

A->BC, B->D, C->FB, B->ED, D->2, F->4, E->0, D->3

-----------

我的问题是:CYK如何帮助我?我如何获得" 2403"来自" A"使用CYK?这个问题有没有更简单的解决方案?

1 个答案:

答案 0 :(得分:0)

我将首先用乔姆斯基范式写出你的语法。目前有两条规则不能满足这个属性;即

B->D
C->F

解决这个问题的一种天真的方法是将它们分解为三个规则:

B->2 
B->3 
C->4

现在您的生产规则是

A->BC  
B->ED  
B->2 
B->3 
C->4
C->FB  
D->2  
D->3  
E->0  
E->1 
F->4  

我使用(here)的求解器不允许数字作为终端。因此,我只是创建一个双射映射

0 <-> a
1 <-> b
2 <-> c
3 <-> d
4 <-> e 

新目标字符串为"cead"而非"2403"。将其插入我的求解器会产生生产规则。

Enter the start Variable A

Number of productions 11
A->BC
B->d
B->ED
C->e
C->FB
E->a
D->c
D->d
F->e
E->b
B->c

Enter string to be checked : cead
    A
          C
    A           B
   DB    CF     E    BD
String can be generated

不幸的是,由于天真的修复,规则有点模糊;但是,我认为这就足够了。