📜  门| GATE-CS-2014-(Set-2) |第 65 题(1)

📅  最后修改于: 2023-12-03 15:42:17.291000             🧑  作者: Mango

门 | GATE-CS-2014-(Set-2) |第 65 题介绍

本题考察了对于自动机或正则表达式的理解和编写能力。

题目描述

给定一个正则表达式 $R$ 和一个字符串 $S$,请编写一个程序来判断字符串 $S$ 是否能够由 $R$ 匹配得到。

输入格式

输入包含两行:

第一行包含一个正则表达式 $R$。

第二行包含一个字符串 $S$。

输出格式

如果 $S$ 能够被 $R$ 匹配,则输出 Yes,否则输出 No

示例

输入

a*b*c
aaabbbccc

输出

Yes
解题思路

本题中的正则表达式只包含 *c 两种字符,即匹配 0 或多个 a。因此,我们可以考虑先利用这个字符集构建出一个自动机,然后利用自动机匹配字符串。

构建自动机的步骤如下:

  • 定义三个状态 S1S2S3 分别表示 abc 三种输入字符出现的情况。
  • 对于输入字符 a,有两条转移边,一条是从 S1S1,另一条是从 S1S2。这两条边分别表示了匹配 0 个 a 和匹配 1 个 a 的情况。
  • 对于输入字符 b,也有两条转移边,一条是从 S2S2,另一条是从 S2S3。这两条边分别表示了匹配 0 个 b 和匹配 1 个 b 的情况。
  • 对于输入字符 c,只有一条转移边,从 S3S3,表示匹配任意个 c 的情况。

构建完自动机之后,我们可以根据输入字符串 $S$ 按顺序遍历自动机的状态,直到遍历完 $S$。如果最后的状态是 S3,则说明 $S$ 能够被匹配,否则不能。

代码实现

下面给出一个 Python 代码的实现,其中 transitions 变量存储了自动机的状态转移表。

transitions = {
    'S1': {'a': ['S1', 'S2'], 'b': ['S1']},
    'S2': {'b': ['S2', 'S3']},
    'S3': {'c': ['S3']}
}

def match(regexp, string):
    state = 'S1'
    for c in string:
        if c not in transitions[state]:
            return False
        state = transitions[state][c][0] if 'S2' in transitions[state][c] else transitions[state][c][0]
    return state == 'S3'

regexp = input().strip()
string = input().strip()
if match(regexp, string):
    print('Yes')
else:
    print('No')

该程序首先定义了 transitions 变量存储自动机的状态转移表。然后定义了一个 match 函数来匹配输入的字符串。该函数按顺序遍历输入字符串中的每个字符,并根据自动机的状态转移表来更新自动机的当前状态。最后判断自动机的最终状态是否为 S3 即可。

注意,在自动机的状态转移表中,当字符为 a 时,有两条转移边,因此需要用一个列表来存储两个可能的下一个状态;而当字符为 b 时,也有两条转移边,但只会有一个是从 S2 状态出发的,因此只需要用一个标志来判断即可。最终状态的判断也需要注意,因为我们定义的只有 S3 才是接受状态,因此最终状态必须为 S3