• 面试题-python3 找出两个字符串中最大公共子字符串


    前言

    算法题(语言不限): 找出两个字符串中最大公共子字符串,如"abjeccarde","sjdgcargde"的最大子串为"car"

    最大公共子字符串

    解决思路:
    1.先遍历a的子字符串
    2.判断a的子字符串同时也在字符串b里,添加到f列表
    3.最后f列表里面取出最后一个,就是最长的子串了

    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    
    a = "abjeccarde"
    b = "sjdgcargde"
    f = []
    # i是字串长度,从1到len(a)
    for i in range(1, len(a)+1):
        # j是下标位置
        for j in range(len(a)+1-i):
            e = a[j:j+i]
            # 判断字串同时也在b,添加过去
            if e in b:
                f.append(e)
    print(f)
    # -1是取出最长的
    print(f[-1])
    

    运行结果:

    ['a', 'j', 'e', 'c', 'c', 'a', 'r', 'd', 'e', 'ca', 'ar', 'de', 'car']
    car
    

    上面的解决思路,虽然没太大问题,得到的结果是一样的,但是这题考的是算法。
    要找出最长的子串,可以先从长的子串遍历,判断符合条件就应该立即结束,没必要继续往下找了。

    找子串

    找出两个字符串中最大公共子字符串,如"abjeccarde","sjdgcargde"的最大子串为"car"。
    这又是一个找子串的问题,跟前面解决思路是一样的,先遍历所有的子串

    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    
    # 遍历a得到所有的子串
    a = "abjeccarde"
    b = "absjdgcargde"
    f = []
    for i in range(1, len(a)+1):
        for j in range(len(a)-i+1):
            # 生成字串的组合
            new_s = a[j:j+i]
            f.append(new_s)
    print(f)
    

    运行结果

    ['a', 'b', 'j', 'e', 'c', 'c', 'a', 'r', 'd', 'e', 
    'ab', 'bj', 'je', 'ec', 'cc', 'ca', 'ar', 'rd', 'de', 
    'abj', 'bje', 'jec', 'ecc', 'cca', 'car', 'ard', 'rde', 
    'abje', 'bjec', 'jecc', 'ecca', 'ccar', 'card', 'arde', 
    'abjec', 'bjecc', 'jecca', 'eccar', 'ccard', 'carde', 
    'abjecc', 'bjecca', 'jeccar', 'eccard', 'ccarde', 
    'abjecca', 'bjeccar', 'jeccard', 'eccarde', 
    'abjeccar', 'bjeccard', 'jeccarde', 
    'abjeccard', 'bjeccarde', 
    'abjeccarde']
    

    题目是要求找出最长的子串,于是可以反着遍历,子串长度从最长到最小

    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    
    
    a = "abjeccarde"
    b = "absjdgcargde"
    f = []
    for i in range(len(a), 0, -1):
        for j in range(len(a)-i+1):
            # 生成字串的组合
            new_s = a[j:j+i]
            f.append(new_s)
    print(f)
    

    于是打印结果

    ['abjeccarde', 
    'abjeccard', 'bjeccarde', 
    'abjeccar', 'bjeccard', 'jeccarde', 
    'abjecca', 'bjeccar', 'jeccard', 'eccarde', 
    'abjecc', 'bjecca', 'jeccar', 'eccard', 'ccarde', 
    'abjec', 'bjecc', 'jecca', 'eccar', 'ccard', 'carde', 
    'abje', 'bjec', 'jecc', 'ecca', 'ccar', 'card', 'arde', 
    'abj', 'bje', 'jec', 'ecc', 'cca', 'car', 'ard', 'rde', 
    'ab', 'bj', 'je', 'ec', 'cc', 'ca', 'ar', 'rd', 'de', 
    'a', 'b', 'j', 'e', 'c', 'c', 'a', 'r', 'd', 'e']
    

    找出公共的子串

    已经遍历出a的子串了,于是判断子串也同时在b里面就可以了, 找到之后用break跳出循环

    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    
    
    a = "abjeccarde"
    b = "absjdgcargde"
    f = []
    # 遍历查找字串长度从最长到1
    for i in range(len(a), 0, -1):
        for j in range(len(a)+1-i):
            e = a[j:j+i]
            if e in b:
                f.append(e)
                # 符合条件就结束跳出循环
                break
        if f:
            break  # 跳出外面的循环
    print(f[0] if f else None)
    

    运行结果:car

    如果考虑到有多个值符合条件,可以去掉里层的break

    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    
    a = "abjeccardek"
    b = "absjdgcargdek"
    f = []
    # 遍历查找字串长度从最长到1
    for i in range(len(a), 0, -1):
        for j in range(len(a)+1-i):
            e = a[j:j+i]
            if e in b:
                f.append(e)
                # # 符合条件就结束跳出循环,考虑到多个值,去掉里层break
                # break
        if f:
            break  # 跳出外面的循环
    print(f)
    

    运行结果:['car', 'dek']

  • 相关阅读:
    参考教程 python 手动搭建ANN,并进行具体实现
    ubuntu18.04 ssh 问题
    Ubuntu18.04 启动后进不了界面 [ failed command: READ DMA ]
    Emacs 使用 markdown 模式
    linux 下 Emacs dired 模式 隐藏 dot file ".filename" 文件
    Ubuntu 16.04 安装后(使用旧的用户目录)登陆不进去
    AWS-SS配置过程
    Jupyter-notebook 导出时不显示Input[]代码
    [网络流24题] 方格取数问题 (最大权独立集---网络最小割)
    [网络流24题] 最长递增子序列 (最多不相交路径---网络最大流)
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/14629867.html
Copyright © 2020-2023  润新知