一个正则表达式指定了一个有限状态机,可以识别可能无限的字符串集合。 字符串集合可能是无限的,但状态数必须是有限的,因此您可以逐个查看状态。
以第二个示例为例:在第一个表达式中,要从状态0到状态1,字符串必须以数字开头。在第二个表达式中,要从状态0到状态1,字符串必须以字母开头。因此,您知道没有字符串会使您从两个表达式的状态0到状态1。你已经得到了答案。
以第一个示例为例:如果字符串以数字开头,则可以使用任何一个正则表达式将其从状态0转换为状态1。因此,现在您可以消除每个正则表达式的状态0,并且只需为两个(现在状态较小的)有限状态机回答问题。
这看起来很像众所周知的“停机问题”,您知道对于图灵机或等效机而言,在一般情况下是不可解的。但实际上,对于有限状态机,停机问题是可解的,因为存在有限数量的状态。
我相信您可以用非确定性FSM解决这个问题。 如果您的正则表达式每个状态到下一个状态仅有一个转换,那么确定性FSM可以解决它。但是,正则表达式意味着例如,如果您在状态2,则如果字符是数字,则转到状态3,否则如果字符是字母,则转到状态4。
所以这是我会做的:
1.为只有一个从一个状态到下一个状态的FSM子集解决它。例如正则表达式匹配“Bob”和“bob”,第二个正则表达式仅匹配“bob”和“boB”。
2.查看是否可以在有限状态机中实现该解决方案。我认为这应该是可能的。状态的输入是表示一个FSM的转换和第二个FSM的转换的一对。例如:State 0:如果(r1,r2)是((“B”或“b”),“b”)则State 1。 State 1:如果(r1,r2)是((“o”),(“o”))则State 2。等等。
3.现在针对更一般的情况,例如第二个状态返回到第二个状态或较早状态;例如,正则表达式1仅识别“meet”,但正则表达式2识别具有无限数量“e”的“meeeet”。您将不得不将它们缩小为正则表达式1仅识别“t”和正则表达式2仅识别“t”。我认为这可以通过非确定性FSM解决。
那就是我的直觉。 我不认为它是NP完全的,只是因为我的直觉告诉我您应该能够在每个步骤中将每个正则表达式缩短一个状态。