字符串查找python实现
依旧是参考java版算法书,使用python重写一遍。涉及到的内容有二分查找,暴力字符串查找,KMP。由KMP扩展的 带正则的自动状态机部分待补充。
这两天将java算法书重新过了一遍,图论部分没看,因为实现起来太麻烦,只看了深度优先及广度优先遍历。
本书其余部分,排序,二叉树,字符串部分均大概过了一遍,为接下来刷题做准备。之后打算每天刷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上题 图部分