-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathL_12_Knut_Moris_Prat.py
93 lines (79 loc) · 2.14 KB
/
L_12_Knut_Moris_Prat.py
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
# S = 'abacabadabacabafabacabadabacabadabacabafaba'
# sub = 'dabac'
def simple_search(S, sub):
sub_len = len(sub)
S_len = len(S)
n = 0
for i in range(S_len - sub_len):
k = i + sub_len
if S[i:k] == sub:
n += 1
print(i, n)
return n
def scan(A):
P = [0] * len(A)
i = 1
j = 0
for k in range(len(A)):
if A[i] == A[j]:
P[i] = j + 1
j += 1
i += 1
else:
if j == 0:
P[i] = 0
i += 1
else:
j = P[j - 1]
print(P)
# scan(A)
# print(len(A))
# ===========================================================================
# simple_search(S,sub)
# ====123456789||||||===========21
S = 'abcabeabcabcabdabcbac'
A = 'abcabd'
# ====123456
tmp = A + '#' + S
print(len(tmp))
def scan_KMP(S, A): # при этом второе вхождение не ловится
P = [0] * (len(A) + 1) + [0] * len(S)
i = 1
j = 0
tmp = A + '#' + S
for k in range(len(tmp)):
if tmp[i] == tmp[j]:
P[i] = j + 1
j += 1
i += 1
else:
if j == 0:
P[i] = 0
i += 1
else:
print('j=', j, 'P[j-1]=', P[j - 1], 'P[j]=', P[j], tmp[j], 'i=', i, tmp[i])
j = P[j - 1]
print('j=', j, 'P[j-1]=', P[j - 1], tmp[j], 'i=', i, tmp[i])
print('j=', j, tmp[j], '||', 'i=', i, tmp[i], '|| P[i-1]=', P[i - 1])
# print(P, len(P))
for n in range(len(P)):
print(n, tmp[n], P[n]) # в тот момент, когда P-функция возвращает 6 (эл-т = длинне искомой строки len(А)) - вхождение найдено
scan_KMP(S, A)
"""
def scan_KMP(S,A):
P = [0]*len(S)
i = 0
j = 0
for k in range(len(S)):
if A[i] == S[j]:
P[i] = j + 1
j+=1
i+=1
print('A[i] == S[j]: =============')
print(P)
else:
print('не равны ------------------')
print(P)
j = 0
print(P)
"""