• 求2个字符串的最长公共子串


     1 s1 = 'abcdefg'
     2 s2 = 'defabcd'
     3 s2 = 'qdefabd'
     4 
     5 #  方法一 :矩阵算法:后面有介绍。可以私聊我
     6 
     7 def findit(s1, s2):
     8     if len(s2) > len(s1): # 从s2 中找 ,用s2 去对比
     9         s1, s2 = s2, s1
    10     xmax = 0
    11     xindex = 0
    12     martix = [[0] * len(s1) for _ in range(len(s2))]
    13 
    14 
    15     for i,x in enumerate(s2):# 拿s2 中的去s1 中比较
    16         for j, y in enumerate(s1):
    17             if x != y:
    18                 pass
    19             else:# 两个字符相同在做处理
    20                 if i == 0 or j == 0: #边界上,只能是 1
    21                     martix[i][j] = 1
    22                 else:
    23                     martix[i][j] = martix[i-1][j-1] + 1 # 前一轮,左上角
    24                     #每轮记录最大值
    25                     if martix[i][j] > xmax:
    26                         xmax = martix[i][j] # 记录最大值,用于下次比较
    27                         xindex = j
    28     print(martix)
    29     start = xindex + 1 - xmax # 切片的起始点索引
    30     end = xindex + 1
    31     print(xmax, xindex, s1[start:end])
    32 
    33 findit(s1, s2)
    34 
    35 
    36 
    37 # 利用切片方式:
    38 
    39 s1 = 'defpabc'
    40 s2 = 'defdefmabcabcdabc'
    41 # s2 = 'qdefabd'
    42 
    43 def  findit(s1, s2):
    44     if len(s2) < len(s1): # 从s2 中找 ,用s2 去对比
    45         s1, s2 = s2, s1
    46 
    47     length = len(s1)
    48     maxlen = 0
    49     for sublen in range(length, 0, -1):# 倒着,从长到短
    50         for start in range(0, length - sublen +1):# 在s2 中起始位置,最长到 length-suben + 1
    51             substr = s1[start:start+sublen]
    52 
    53             #  有缺点
    54             # if s2.find(substr) > -1:
    55             #     # print(substr)
    56             #     return  substr # 缺点:只能输出第一次遇到的子串
    57 
    58             # 修改
    59             if s2.find(substr) > -1:
    60                 if len(substr) >= maxlen:
    61                     maxlen = len(substr) # 记录如果大于,则记录下,以便下次来了在比较
    62                     print(substr)
    63 
    64 findit(s1, s2)
    65 
    66 #  我自己写的,
    67 # 思路是,从左往右,不断缩小,第一次 定第一个字母,从后往前找,第二次,定第二个字母,从后往前找,以此类推,遇到相同的记录,同时记录这次
    68 # 的长度,下次比较这个长度 ,比这个长度短的就不用再比较了
    69 s1 = 'abcdeg' # abcdef
    70 s1 = 'a1b' # abcdef
    71 s1 = 'a1bc1doddddde1fff1g' # abcdef
    72 s2 = 'defabcdoabcdeftw' #abcdef
    73 
    74 length = len(s1)
    75 lens = {}
    76 max_num = 0
    77 
    78 for i in range(length):
    79     for j in range(length, i, -1):
    80         if s1[i:j] in s2  and len(s1[i:j]) >= max_num:
    81             lens[s1[i:j]] = lens.get(s1[i:j], 0) + len(s1[i:j])
    82             max_num = len(s1[i:j])
    83 
    84 for i in sorted(lens):
    85     if len(i) == max_num:
    86         print(i)

     通过图片可以理解:

      

    为什么要坚持,想一想当初!
  • 相关阅读:
    音频波谱通用类|超酷的说
    跟随鼠标的星星实例
    AS3放大镜工具类
    caurina缓动类
    AS3中 is,as,typeof的区别
    Loader ,URLLoader ,URLStream的区别
    (转)AS3正则:元子符,元序列,标志,数量表达符
    动态绘制扇形实例
    AS3.0绘图API
    as3效率优化
  • 原文地址:https://www.cnblogs.com/JerryZao/p/9574910.html
Copyright © 2020-2023  润新知