字符串查找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上题 图部分

 

posted @ 2018-11-18 22:22  涨涨涨123  阅读(402)  评论(0编辑  收藏  举报