📌  相关文章
📜  DFA接受w∈(a,b)*上的所有字符串,其中包含“ aba”作为子字符串(1)

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

DFA接受包含“aba”作为子字符串的字符串

本篇介绍如何使用DFA接受由'a'和'b'组成的字符串,其中必须包含子串"aba"。

状态转移图

首先,我们需要构建状态转移图。

该DFA总共有4个状态,分别用S0、S1、S2和S3来表示。

  • 起始状态为S0
  • 结束状态为S3

状态转移规则如下:

| 当前状态 | 输入 | 下一状态 | | -------- | ---- | -------- | | S0 | a | S1 | | S0 | b | S0 | | S1 | a | S2 | | S1 | b | S0 | | S2 | a | S3 | | S2 | b | S0 | | S3 | a | S3 | | S3 | b | S3 |

Python代码实现

接下来,我们可以用Python代码实现该DFA。具体实现如下:

def dfa_aba(input_string):
    """
    判断该字符串是否包含子串"aba"
    :param input_string: 待判断字符串
    :return: True or False
    """
    # 状态转移字典
    state_transition_dict = {
        'S0': {'a': 'S1', 'b': 'S0'},
        'S1': {'a': 'S2', 'b': 'S0'},
        'S2': {'a': 'S3', 'b': 'S0'},
        'S3': {'a': 'S3', 'b': 'S3'}
    }
    
    current_state = 'S0'  # 起始状态

    for c in input_string:
        if c not in ['a', 'b']:
            # 非法输入字符,直接返回False
            return False
        
        if state_transition_dict[current_state][c] == 'S3':
            # 当前状态为结束状态,直接返回True
            return True
        
        current_state = state_transition_dict[current_state][c]  # 更新当前状态
    
    return False  # 遍历整个字符串后,如未到达结束状态,则返回False

测试样例

最后,我们可以用一些测试样例来验证该DFA的正确性。

assert dfa_aba('ab') == False
assert dfa_aba('aba') == True
assert dfa_aba('abab') == False
assert dfa_aba('bababa') == False
assert dfa_aba('abababa') == True

以上测试样例均测试通过。

完整代码如下:

def dfa_aba(input_string):
    """
    判断该字符串是否包含子串"aba"
    :param input_string: 待判断字符串
    :return: True or False
    """
    # 状态转移字典
    state_transition_dict = {
        'S0': {'a': 'S1', 'b': 'S0'},
        'S1': {'a': 'S2', 'b': 'S0'},
        'S2': {'a': 'S3', 'b': 'S0'},
        'S3': {'a': 'S3', 'b': 'S3'}
    }
    
    current_state = 'S0'  # 起始状态

    for c in input_string:
        if c not in ['a', 'b']:
            # 非法输入字符,直接返回False
            return False
        
        if state_transition_dict[current_state][c] == 'S3':
            # 当前状态为结束状态,直接返回True
            return True
        
        current_state = state_transition_dict[current_state][c]  # 更新当前状态
    
    return False  # 遍历整个字符串后,如未到达结束状态,则返回False


assert dfa_aba('ab') == False
assert dfa_aba('aba') == True
assert dfa_aba('abab') == False
assert dfa_aba('bababa') == False
assert dfa_aba('abababa') == True