字符串查找python實現

依舊是參考java版算法書,使用python重寫一遍。涉及到的內容有二分查找,暴力字符串查找,KMP。由KMP擴展的 帶正則的自動狀態機部分待補充。java

這兩天將java算法書從新過了一遍,圖論部分沒看,由於實現起來太麻煩,只看了深度優先及廣度優先遍歷。python

本書其他部分,排序,二叉樹,字符串部分均大概過了一遍,爲接下來刷題作準備。以後打算天天刷2-3道LeetCode的題。鍛鍊本身工程能力算法

 1 import random
 2 ###隨機生成字符串
 3 #s1='qwertyuiopasdfghjklzxcvbnm1234567890'
 4 #s=''.join(random.choice(s1)for i in range(100) )
 5 
 6 s2='zxnauj0zwchqgxa1k6rbvau8w1l0hxsejy8uocynqloeyhgz9pl7l90orhtn2x5aj9rjentpp5gl031kmb1w544qgpysdtntndn2'
 7 subs='ndn2'
 8 
 9 ####暴力字符串查找
10 def search(t,pat):
11     n=len(t)
12     m=len(pat)
13     for i in range(n-m+1):
14         j=0
15         while j<m:
16             if pat[j]!=t[i+j]:
17                 break
18             j+=1
19         if j==m:
20             return i
21     return n
22 
23 ######KMP 核心在於利用模式模式串中重複詞組進行優化,知道next數組求法是關鍵。遞歸求next數組時可當作next數組持續遞歸,注意初始化條件
24 def getnext(t):
25     next=[0]*len(t)
26     next[0]=-1
27     j=0
28     k=-1
29     while j<len(t)-1:
30         if k==-1 or t[j]==t[k]:
31             j+=1
32             k+=1
33             next[j]=k
34         else:
35             k=next[k]
36     return next
37 def KMPsearch(a,pat):
38     next=getnext(pat)
39     i=0
40     j=0
41     n=len(a)
42     m=len(pat)
43     while i<=n:
44         if j==-1 or a[i]==pat[j]:
45             i+=1
46             j+=1
47         else:
48             j=next[j]
49         if j==m:
50             return i-j
51     return -1
52 
53 ###############
54 print(KMPsearch(s2,subs))
55 
56 #####二分查找
57 def binary(a,t):
58     lo=0
59     hi=len(a)-1
60     mid=0
61     while lo<=hi:
62         mid=int((hi-lo)/2+lo)
63         if a[mid]==t:
64             return mid
65         elif a[mid]>t:
66             hi=mid-1
67         elif a[mid]<t:
68             lo=mid+1
69     if a[mid]!=t:
70         return False
71 
72 t=[x for x in range(23)]
73 print(t.index(12))
74 print(binary( t,10.5))
75 
76 #####dfs深度優先遍歷
77 ######bfs廣度優先遍歷
78 #######這兩種遍歷思想很簡單,即搜索,回退,遍歷全部可能性。不太好寫例子,參考leetco上題 圖部分
相關文章
相關標籤/搜索