Skip to content

Commit 36e30a0

Browse files
String Matching using Finite Automata added in Others/StringMatchFiniteAutomata.java
1 parent 0705384 commit 36e30a0

File tree

1 file changed

+91
-0
lines changed

1 file changed

+91
-0
lines changed

Others/StringMatchFiniteAutomata.java

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
/**
2+
* @author Prateek Kumar Oraon (https://github.com/prateekKrOraon)
3+
*/
4+
import java.util.Scanner;
5+
6+
//An implementaion of string matching using finite automata
7+
public class StringMatchFiniteAutomata{
8+
9+
public static final int CHARS = 256;
10+
public static int[][] FA;
11+
public static Scanner scanner = null;
12+
13+
public static void main(String[] args){
14+
15+
scanner = new Scanner(System.in);
16+
System.out.println("Enter String");
17+
String text = scanner.nextLine();
18+
System.out.println("Enter pattern");
19+
String pat = scanner.nextLine();
20+
21+
searchPat(text, pat);
22+
23+
scanner.close();
24+
25+
}
26+
27+
public static void searchPat(String text, String pat){
28+
29+
int m = pat.length();
30+
int n = text.length();
31+
32+
FA = new int[m+1][CHARS];
33+
34+
computeFA(pat, m ,FA);
35+
36+
int state = 0;
37+
for(int i=0;i<n;i++){
38+
state = FA[state][text.charAt(i)];
39+
40+
if(state == m){
41+
System.out.println("Pattern found at index " + (i-m+1));
42+
}
43+
}
44+
45+
}
46+
47+
//Computes finite automata for the partern
48+
public static void computeFA(String pat, int m, int[][] FA){
49+
50+
for(int state = 0; state<= m; ++state){
51+
for(int x =0; x< CHARS; ++x){
52+
FA[state][x] = getNextState(pat, m, state, x);
53+
}
54+
}
55+
56+
}
57+
58+
public static int getNextState(String pat, int m, int state, int x){
59+
60+
//if current state is less than length of pattern
61+
//and input character of pattern matches the character in the alphabet
62+
//then automata goes to next state
63+
if(state < m && x==pat.charAt(state)){
64+
return state+1;
65+
}
66+
67+
for(int ns = state; ns>0; ns--){
68+
69+
if(pat.charAt(ns-1) == x){
70+
71+
for(int i=0; i<ns-1; i++){
72+
73+
if(pat.charAt(i) != pat.charAt(state-ns+i+1)){
74+
break;
75+
}
76+
77+
if(i == ns-1){
78+
return ns;
79+
}
80+
81+
}
82+
83+
}
84+
85+
}
86+
87+
return 0;
88+
89+
}
90+
91+
}

0 commit comments

Comments
 (0)