zoukankan      html  css  js  c++  java
  • 字符串查找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上题 图部分
  • 相关阅读:
    富文本编辑器编辑
    你是怎么发上去的
    f
    xxx
    test
    sgsdg
    code
    html2canvas.js——HTML转Canvas工具
    后台返回流图片的处理方式。(原生,JQ,VUE)
    渐进式web应用开发---service worker
  • 原文地址:https://www.cnblogs.com/the-home-of-123/p/9979989.html
Copyright © 2011-2022 走看看