forked from jainaman224/Algo_Ds_Notes
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Boyer_Moore.go
78 lines (61 loc) · 1.71 KB
/
Boyer_Moore.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/*Boyer Moore Algorithm for Pattern Search*/
package main
import "fmt"
func max(a, b int) int {
if a > b {
return a
}
return b
}
//Using Bad Character Heuristic method
func preprocess(str string, length int, chars []int) {
for i,_:=range(chars) {chars[i] = 1}
//The last occurrence of the char
for k := 0; k < length; k++ {
chars[int(str[k])] = k;
}
}
func boyreMoore(text string, pattern string) {
var lenStr int = len(text)
var lenPattern int = len(pattern)
chars := make([]int, 128)
preprocess(pattern, lenPattern, chars)
//shift of the pattern with respect to text
var shift int = 0
for shift <= lenStr - lenPattern {
match := lenPattern - 1
for (match >= 0 && pattern[match] == text[shift + match]) {
match = match - 1
}
// If pattern found, match = -1
if match < 0 {
fmt.Printf("Pattern found at : %d\n", shift)
// Shift the pattern so that the next character in text
//aligns with the last occurrence of it in pattern.
if shift + lenPattern < lenStr {
shift = shift + lenPattern - chars[text[shift + lenPattern]]
} else {
shift = 1
}
} else {
shift = shift + max(1, match - chars[text[shift + match]]);
}
}
}
func main() {
var text string
var pattern string
fmt.Println("Enter the text : ")
fmt.Scan(&text)
fmt.Println("Enter the pattern to search : ")
fmt.Scan(&pattern)
boyreMoore(text, pattern)
}
/*Input :
* Enter the text :
* therethenthat
* Enter the pattern :
* the
* Pattern found at : 0
* Pattern found at : 8
*/