Given a string S that represents an integer, the task is to check if the given string S represents an unsigned integer or not by constructing the DFA. If the given string represents an unsigned integer, then print "Unsigned integer". Otherwise, print "Not an unsigned integer".
Examples:
Input: S = "+4554"
Output: Not an unsigned integerInput: S = "1729"
Output: unsigned integer
Approach: Below is the transition states of DFA for the given problem:
Follow the steps below to solve the problem:
- Declare a function to build and connect DFA states as per the given conditions. Below are the representation of the transitions states:
- 0 represents a digit.
- 1 represents sign "+/-".
- 2 represents "." or dot.
- 3 represents any other character.
- 4 represents exponent(e/E sign).
- Initialize a variable, say currentState as 0, that stores the current state in the DFA.
- Traverse the string S and based on the current state and present character at the current index decide the next state of the DFA.
- After completing the above steps, if the value of currentState is either 1 or 4 or 8, then print "Unsigned integer". Otherwise, print "Not an unsigned integer".
Below is the implementation of the above approach:
// 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 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 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# 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
<script>
// JavaScript program for the above approach
let digits = "0123456789", sign = "+-";
let dot = ".", ex = "eE";
let dfa = new Array(11);
for(let i=0;i<11;i++)
{
dfa[i]=new Array(5);
}
// Function to construct DFA as per the
// given conditions
function 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
function buildDFA()
{
// Connect all the states to the
// dead state
for(let i = 0; i < 11; i++)
for(let 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
function checkDFA(s)
{
// Build the DFA
buildDFA();
// Stores the current state
let currentstate = 0;
// Traverse the string
for(let 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)
{
document.write("Unsigned integer<br>");
}
else
{
document.write("Not an unsigned integer");
}
}
// Driver Code
let S = "1729";
checkDFA(S);
// This code is contributed by avanitrachhadiya2155
</script>
Output:
Unsigned integer
Time Complexity: O(N)
Auxiliary Space: O(1), since no extra space has been taken.
