-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathq2
95 lines (95 loc) · 2.55 KB
/
q2
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
def boyerMoore(pat,txt):
r_arr=rPreprocessing(pat)
gs_arr=goodSuffix(pat)
mp_arr=matchPrefix(pat)
i=0
start, stop = None, None
while len(txt)-i>=len(pat):
j=i+len(pat)-1
while j>=i:
if start is not None and stop is not None and start <= j - i <= stop:
if i==j:
print(j + 1)
elif txt[j] != pat[j - i]:
bcr=max(1, j-r_arr[j-i][ord(txt[j-i])-97]-i)
gs=gs_arr[j - i]
if (gs >= bcr):
i+=gs
else:
i+=bcr
break
elif i == j:
print(j + 1)
i += 1
j -= 1
if gs_arr[j - i] > 0:
start = gs_arr[j - i] - len(pat) + j - i
stop = gs_arr[j - i]
else:
start = 1
stop = mp_arr[j - i]
def rPreprocessing(pat):
alphabet_size = 3
output_arr = [[-1] * alphabet_size]
i = 0
while i < len(pat):
alphabet_index = ord(pat[i]) - 97
if i != 0:
output_arr.append(output_arr[i - 1].copy())
output_arr[i][alphabet_index] = i
i += 1
return output_arr
def goodSuffix(pat):
reversed_pat=pat[::-1]
z_algo_arr=z_algo(reversed_pat)
reversed_z_algo=z_algo_arr[::-1]
good_suff=(len(pat)+1)*[0]
p=0
while p<len(pat)-1:
j=len(pat)-reversed_z_algo[p]
good_suff[j]=p+1
p+=1
return good_suff
def matchPrefix(pat):
z_algo_arr = z_algo(pat)
match_prefix = (len(pat) + 1) * [0]
i=len(pat)-1
while i>=0:
if z_algo_arr[i]+i==len(pat):
match_prefix[i]=z_algo_arr[i]
else:
match_prefix[i]=match_prefix[i+1]
i-=1
return match_prefix
def z_algo(input_str):
n=len(input_str)
z=[0]*n
z[0]=n
r=None
l=None
def compare(furthest_index,base_index):
i = 0;
while furthest_index+i<len(input_str):
if input_str[base_index + i]==input_str[furthest_index+i]:
i+=1;
else:
break;
return furthest_index+i;
k=1
while k<n:
if r is None or k>r:
q=compare(k, 0)
z[k]=q-k
if q-k>0:
r = q-1
l = k
elif z[k-l]<r-k+1:
z[k]=z[k-l]
elif z[k - l]>=r-k+1:
q=compare(r+1, r-k+1)
z[k]=q-k
l=k
r=q-1
k+=1
return z
boyerMoore('acababacaba', 'abacababacabacabacababacabac')