File tree 1 file changed +55
-0
lines changed
1 file changed +55
-0
lines changed Original file line number Diff line number Diff line change
1
+
2
+ /*
3
+ Implementation of Knuth–Morris–Pratt algorithm
4
+ Usage:
5
+ final String T = "AAAAABAAABA";
6
+ final String P = "AAAA";
7
+ KMPmatcher(T, P);
8
+ */
9
+ public class KMP {
10
+
11
+ // find the starting index in string T[] that matches the search word P[]
12
+ public void KMPmatcher (final String T , final String P ) {
13
+ final int m = T .length ();
14
+ final int n = P .length ();
15
+ final int [] pi = computePrefixFunction (P );
16
+ int q = 0 ;
17
+ for (int i = 0 ; i < m ; i ++) {
18
+ while (q > 0 && T .charAt (i ) != P .charAt (q )) {
19
+ q = pi [q - 1 ];
20
+ }
21
+
22
+ if (T .charAt (i ) == P .charAt (q )) {
23
+ q ++;
24
+ }
25
+
26
+ if (q == n ) {
27
+ System .out .println ("Pattern starts: " + (i + 1 - n ));
28
+ q = pi [q - 1 ];
29
+ }
30
+ }
31
+
32
+ }
33
+
34
+ // return the prefix function
35
+ private int [] computePrefixFunction (final String P ) {
36
+ final int n = P .length ();
37
+ final int [] pi = new int [n ];
38
+ pi [0 ] = 0 ;
39
+ int q = 0 ;
40
+ for (int i = 1 ; i < n ; i ++) {
41
+ while (q > 0 && P .charAt (q ) != P .charAt (i )) {
42
+ q = pi [q - 1 ];
43
+ }
44
+
45
+ if (P .charAt (q ) == P .charAt (i )) {
46
+ q ++;
47
+ }
48
+
49
+ pi [i ] = q ;
50
+
51
+ }
52
+
53
+ return pi ;
54
+ }
55
+ }
You can’t perform that action at this time.
0 commit comments