依舊是參考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上題 圖部分