Java Program to Perform Finite State Automaton based Search

This is a java program to perform search using DFA.

Here is the source code of the Java Program to Perform Finite State Automaton based Search. The Java program is successfully compiled and run on a Windows system. The program output is also shown below.

package com.maixuanviet.setandstring;
 
import java.util.Scanner;
 
public class SearchStringUsingDFA
{
    public static final int NO_OF_CHARS = 256;
 
    public static int getNextState(char[] pat, int M, int state, int x)
    {
        /*
         * If the character c is same as next character in pattern,
         * then simply increment state
         */
        if (state < M && x == pat[state])
            return state + 1;
        int ns, i;
        /*
         * ns stores the result which is next state
         * ns finally contains the longest prefix which is also suffix
         * in "pat[0..state-1]c"
         * Start from the largest possible value and stop when you find
         * a prefix which is also suffix
         */
        for (ns = state; ns > 0; ns--)
        {
            if (pat[ns - 1] == x)
            {
                for (i = 0; i < ns - 1; i++)
                {
                    if (pat[i] != pat[state - ns + 1 + i])
                        break;
                }
                if (i == ns - 1)
                    return ns;
            }
        }
        return 0;
    }
 
    /*
     * This function builds the TF table which represents Finite Automata for a
     * given pattern
     */
    public static void computeTF(char[] pat, int M, int[][] TF)
    {
        int state, x;
        for (state = 0; state <= M; ++state)
            for (x = 0; x < NO_OF_CHARS; ++x)
                TF[state][x] = getNextState(pat, M, state, x);
    }
 
    /*
     * Prints all occurrences of pat in txt
     */
    public static void search(char[] pat, char[] txt)
    {
        int M = pat.length;
        int N = txt.length;
        int[][] TF = new int[M + 1][NO_OF_CHARS];
        computeTF(pat, M, TF);
        // Process txt over FA.
        int i, state = 0;
        for (i = 0; i < N; i++)
        {
            state = TF[state][txt[i]];
            if (state == M)
            {
                System.out.print(pat);
                System.out.print(" found at " + (i - M + 1));
            }
        }
    }
 
    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter the main string: ");
        String main = sc.nextLine();
        System.out.println("Enter the pattern string: ");
        String pattern = sc.nextLine();
        search(pattern.toCharArray(), main.toCharArray());
        sc.close();
    }
}

Output:

$ javac SearchStringUsingDFA.java
$ java SearchStringUsingDFA
 
Enter the main string: 
Sanfoundry is No. 1 choice for Deep Hands-ON Trainings in SAN, Linux & C, Kernel & Device Driver Programming. Our Founder has trained employees of almost all Top Companies in India. Here are few of them: VMware, Citrix, Oracle, Motorola, Ericsson, Aricent, HP, Intuit, Microsoft, Cisco, SAP Labs, Siemens, Symantec, Redhat, Chelsio, Cavium Networks, ST Microelectronics, Samsung, LG-Soft, Wipro, TCS, HCL, IBM, Accenture, HSBC, Northwest Bank, Mphasis, Tata Elxsi, Tata Communications, Mindtree, Cognizant, mid size IT companies and many Startups. Students from top Universities and colleges such as NIT Trichy, BITS Pilani, University of California, Irvine, University of Texas, Austin & PESIT Bangalore have benefited a lot from these courses as well. The assignments and real time projects for our courses are of extremely high quality with excellent learning curve.
Enter the pattern string: 
Trainings
Trainings found at 45

Related posts:

Java Program to Implement Strassen Algorithm
Spring 5 WebClient
Java Program to Check Whether a Given Point is in a Given Polygon
Java Program to Implement the linear congruential generator for Pseudo Random Number Generation
Spring Boot - Sending Email
ArrayList trong java
Java Program to Perform Optimal Paranthesization Using Dynamic Programming
Spring Boot - Database Handling
Java Program to Generate All Pairs of Subsets Whose Union Make the Set
Java Program to Check for balanced parenthesis by using Stacks
Java Program to do a Depth First Search/Traversal on a graph non-recursively
Java Program to Implement Ford–Fulkerson Algorithm
Intro to Inversion of Control and Dependency Injection with Spring
Java Program to Implement ArrayDeque API
Spring Data JPA and Null Parameters
Queue và PriorityQueue trong Java
New in Spring Security OAuth2 – Verify Claims
Hashing a Password in Java
Spring Security Logout
Remove HTML tags from a file to extract only the TEXT
Java Program to Solve Travelling Salesman Problem for Unweighted Graph
Java Program to Perform Uniform Binary Search
Chương trình Java đầu tiên
Java Program to Check if a Directed Graph is a Tree or Not Using DFS
Java Program to Implement Rope
Java Program to Check Whether an Undirected Graph Contains a Eulerian Cycle
Java Program to Implement Cartesian Tree
Java Program to Find Path Between Two Nodes in a Graph
Guide to java.util.Formatter
Form Validation with AngularJS and Spring MVC
Java Program to Compute Determinant of a Matrix
Removing all duplicates from a List in Java