📌  相关文章
📜  构建 DFA 以检查给定整数是否无符号的程序

📅  最后修改于: 2021-09-07 02:33:31             🧑  作者: Mango

给定一个表示整数的字符串S ,任务是通过构造 DFA 来检查给定的字符串S 是否表示无符号整数。如果给定的字符串表示一个无符号整数,则打印“Unsigned integer” 。否则,打印“Not an unsigned integer”

例子:

方法:以下是给定问题的 DFA 过渡状态:

请按照以下步骤解决问题:

  • 声明一个函数以根据给定条件构建和连接 DFA 状态。以下是转换状态的表示:
    • 0代表一个数字
    • 1代表符号“+/-”
    • 2代表“.”
    • 3代表任何其他字符
    • 4代表指数(e/E 符号)
  • 初始化一个变量,比如currentState0 ,它将当前状态存储在 DFA 中。
  • 遍历字符串S并根据当前状态和当前索引处的当前字符决定DFA的下一个状态。
  • 完成上述步骤后,如果currentState 的值为148 ,则打印“无符号整数” 。否则,打印“Not an unsigned integer”

下面是上述方法的实现:

C++
// C++ program for the above approach
 
#include "bits/stdc++.h"
using namespace std;
 
string digits = "0123456789", sign = "+-";
string dot = ".", ex = "eE";
int dfa[11][5];
 
// Function to construct DFA as per the
// given conditions
void makeDFA()
{
    // If at state 0 and a digit has
    // occurred then set it to state 1
    dfa[0][0] = 1;
 
    // Similarly for all other states
    dfa[1][0] = 1;
    dfa[1][2] = 3;
    dfa[1][3] = 2;
    dfa[1][4] = 6;
 
    dfa[3][0] = 4;
 
    dfa[4][0] = 4;
    dfa[4][3] = 5;
    dfa[4][4] = 6;
 
    dfa[6][0] = 8;
    dfa[6][1] = 7;
 
    dfa[7][0] = 8;
 
    dfa[8][0] = 8;
    dfa[8][3] = 9;
}
 
// Function to build and connect
// the DFA states
void buildDFA()
{
    // Connect all the states to the
    // dead state
    for (int i = 0; i < 11; i++)
        for (int j = 0; j < 5; j++)
            dfa[i][j] = 10;
 
    // Function call to make DFA as
    // per the given conditions
    makeDFA();
}
 
// Function call to check whether an
// integer in the form of string is
// unsigned integer or not
void checkDFA(string s)
{
    // Build the DFA
    buildDFA();
 
    // Stores the current state
    int currentstate = 0;
 
    // Traverse the string
    for (int i = 0; i < s.size(); i++) {
 
        if (digits.find(s[i])
            != digits.npos)
 
            // If at a certain state a
            // digit occurs then change
            // the current state according
            // to the DFA
            currentstate
                = dfa[currentstate][0];
 
        // Or +/- sign
        else if (sign.find(s[i])
                 != sign.npos)
            currentstate
                = dfa[currentstate][1];
 
        // Or decimal occurred
        else if (dot.find(s[i])
                 != dot.npos)
            currentstate
                = dfa[currentstate][2];
 
        // Or any other character
        else if (ex.find(s[i])
                 != ex.npos)
            currentstate
                = dfa[currentstate][4];
 
        // Or e/E or exponent sign
        else
            currentstate
                = dfa[currentstate][3];
    }
 
    // State 1, 4, 8 will give
    // the final answer
    if (currentstate == 1
        || currentstate == 4
        || currentstate == 8) {
        cout << "Unsigned integer";
    }
    else {
        cout << "Not an unsigned integer";
    }
}
 
// Driver Code
int main()
{
    string S = "1729";
    checkDFA(S);
 
    return 0;
}


Java
// Java program for the above approach
import java.io.*;
import java.lang.*;
import java.util.*;
 
class GFG{
 
static String digits = "0123456789", sign = "+-";
static String dot = ".", ex = "eE";
static int dfa[][] = new int[11][5];
 
// Function to construct DFA as per the
// given conditions
static void makeDFA()
{
     
    // If at state 0 and a digit has
    // occurred then set it to state 1
    dfa[0][0] = 1;
 
    // Similarly for all other states
    dfa[1][0] = 1;
    dfa[1][2] = 3;
    dfa[1][3] = 2;
    dfa[1][4] = 6;
 
    dfa[3][0] = 4;
 
    dfa[4][0] = 4;
    dfa[4][3] = 5;
    dfa[4][4] = 6;
 
    dfa[6][0] = 8;
    dfa[6][1] = 7;
 
    dfa[7][0] = 8;
 
    dfa[8][0] = 8;
    dfa[8][3] = 9;
}
 
// Function to build and connect
// the DFA states
static void buildDFA()
{
     
    // Connect all the states to the
    // dead state
    for(int i = 0; i < 11; i++)
        for(int j = 0; j < 5; j++)
            dfa[i][j] = 10;
 
    // Function call to make DFA as
    // per the given conditions
    makeDFA();
}
 
// Function call to check whether an
// integer in the form of string is
// unsigned integer or not
static void checkDFA(String s)
{
     
    // Build the DFA
    buildDFA();
 
    // Stores the current state
    int currentstate = 0;
 
    // Traverse the string
    for(int i = 0; i < s.length(); i++)
    {
        if (digits.indexOf(s.charAt(i)) != -1)
 
            // If at a certain state a
            // digit occurs then change
            // the current state according
            // to the DFA
            currentstate = dfa[currentstate][0];
 
        // Or +/- sign
        else if (sign.indexOf(s.charAt(i)) != -1)
            currentstate = dfa[currentstate][1];
 
        // Or decimal occurred
        else if (dot.indexOf(s.charAt(i)) != -1)
            currentstate = dfa[currentstate][2];
 
        // Or any other character
        else if (ex.indexOf(s.charAt(i)) != -1)
            currentstate = dfa[currentstate][4];
 
        // Or e/E or exponent sign
        else
            currentstate = dfa[currentstate][3];
    }
 
    // State 1, 4, 8 will give
    // the final answer
    if (currentstate == 1 || currentstate == 4 ||
        currentstate == 8)
    {
        System.out.println("Unsigned integer");
    }
    else
    {
        System.out.println("Not an unsigned integer");
    }
}
 
// Driver Code
public static void main(String[] args)
{
    String S = "1729";
     
    checkDFA(S);
}
}
 
// This code is contributed by Kingash


Python3
# Python3 program for the above approach
digits,sign = "0123456789", "+-"
dot, ex = ".", "eE"
dfa = [[0 for i in range(5)] for i in range(11)]
 
# Function to construct DFA as per the
# given conditions
def makeDFA():
    global dfa
 
    # If at state 0 and a digit has
    # occurred then set it to state 1
    dfa[0][0] = 1
 
    # Similarly for all other states
    dfa[1][0] = 1
    dfa[1][2] = 3
    dfa[1][3] = 2
    dfa[1][4] = 6
 
    dfa[3][0] = 4
 
    dfa[4][0] = 4
    dfa[4][3] = 5
    dfa[4][4] = 6
 
    dfa[6][0] = 8
    dfa[6][1] = 7
 
    dfa[7][0] = 8
 
    dfa[8][0] = 8
    dfa[8][3] = 9
 
 
# Function to build and connect
# the DFA states
def buildDFA():
    global dfa
    # Connect all the states to the
    # dead state
    for i in range(11):
        for j in range(5):
            dfa[i][j] = 10
 
    # Function call to make DFA as
    # per the given conditions
    makeDFA()
 
# Function call to check whether an
# integer in the form of is
# unsigned integer or not
def checkDFA(s):
    # Build the DFA
    buildDFA()
 
    # Stores the current state
    currentstate = 0
 
    # Traverse the string
    for i in range(len(s)):
 
        if (s[i] in digits):
 
            # If at a certain state a
            # digit occurs then change
            # the current state according
            # to the DFA
            currentstate = dfa[currentstate][0]
 
        # Or +/- sign
        elif (s[i] in sign):
            currentstate = dfa[currentstate][1]
 
        # Or decimal occurred
        elif (s[i] in dot):
            currentstate = dfa[currentstate][2]
 
        # Or any other character
        elif (s[i] in ex):
            currentstate = dfa[currentstate][4]
 
        # Or e/E or exponent sign
        else:
            currentstate = dfa[currentstate][3]
 
    # State 1, 4, 8 will give
    # the final answer
    if (currentstate == 1 or currentstate == 4 or currentstate == 8):
        print("Unsigned integer")
    else:
        print("Not an unsigned integer")
 
# Driver Code
if __name__ == '__main__':
    S = "1729"
    checkDFA(S)
 
    # This code is contributed by mohit kumar 29.


C#
// C# program for the above approach
using System;
 
class GFG{
 
static string digits = "0123456789", sign = "+-";
static string dot = ".", ex = "eE";
static int[,] dfa = new int[11, 5];
 
// Function to construct DFA as per the
// given conditions
static void makeDFA()
{
 
    // If at state 0 and a digit has
    // occurred then set it to state 1
    dfa[0, 0] = 1;
 
    // Similarly for all other states
    dfa[1, 0] = 1;
    dfa[1, 2] = 3;
    dfa[1, 3] = 2;
    dfa[1, 4] = 6;
 
    dfa[3, 0] = 4;
 
    dfa[4, 0] = 4;
    dfa[4, 3] = 5;
    dfa[4, 4] = 6;
 
    dfa[6, 0] = 8;
    dfa[6, 1] = 7;
 
    dfa[7, 0] = 8;
 
    dfa[8, 0] = 8;
    dfa[8, 3] = 9;
}
 
// Function to build and connect
// the DFA states
static void buildDFA()
{
 
    // Connect all the states to the
    // dead state
    for(int i = 0; i < 11; i++)
        for(int j = 0; j < 5; j++)
            dfa[i, j] = 10;
 
    // Function call to make DFA as
    // per the given conditions
    makeDFA();
}
 
// Function call to check whether an
// integer in the form of string is
// unsigned integer or not
static void checkDFA(string s)
{
 
    // Build the DFA
    buildDFA();
 
    // Stores the current state
    int currentstate = 0;
 
    // Traverse the string
    for(int i = 0; i < s.Length; i++)
    {
        if (digits.IndexOf(s[i]) != -1)
 
            // If at a certain state a
            // digit occurs then change
            // the current state according
            // to the DFA
            currentstate = dfa[currentstate, 0];
 
        // Or +/- sign
        else if (sign.IndexOf(s[i]) != -1)
            currentstate = dfa[currentstate, 1];
 
        // Or decimal occurred
        else if (dot.IndexOf(s[i]) != -1)
            currentstate = dfa[currentstate, 2];
 
        // Or any other character
        else if (ex.IndexOf(s[i]) != -1)
            currentstate = dfa[currentstate, 4];
 
        // Or e/E or exponent sign
        else
            currentstate = dfa[currentstate, 3];
    }
 
    // State 1, 4, 8 will give
    // the final answer
    if (currentstate == 1 || currentstate == 4 ||
        currentstate == 8)
    {
        Console.WriteLine("Unsigned integer");
    }
    else
    {
        Console.WriteLine("Not an unsigned integer");
    }
}
 
// Driver Code
public static void Main(string[] args)
{
    string S = "1729";
 
    checkDFA(S);
}
}
 
// This code is contributed by ukasp


输出:
Unsigned integer

时间复杂度: O(N)
辅助空间: O(1)

如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live