首页 > 编程语言 >python 最长公共前缀 5种解法

python 最长公共前缀 5种解法

时间:2023-12-23 10:02:50浏览次数:41  
标签:return 前缀 python string len strs prefix 解法 left

解法一:水平扫描 这是最简单的一种方法,逐个字符比较每个字符串的相应位置,直到遇到不匹配的字符为止。

def longest_common_prefix(strs):
    if not strs:
        return ""
    prefix = strs[0]
    for i in range(1, len(strs)):
        while strs[i].find(prefix) != 0:
            prefix = prefix[:-1]
            if not prefix:
                return ""
    return prefix

解法二:垂直扫描 在解法一中,我们对每个字符串进行了多次查找操作。为了优化性能,可以将查找操作转换为比较每个字符串的相同索引位置的字符。

def longest_common_prefix(strs):
    if not strs:
        return ""
    for i in range(len(strs[0])):
        char = strs[0][i]
        for string in strs[1:]:
            if i >= len(string) or string[i] != char:
                return strs[0][:i]
    return strs[0]

解法三:分治法 将问题分解为更小的子问题,然后递归求解。将字符串数组拆分为两半,分别找出左半部分和右半部分的最长公共前缀,再将两者的最长公共前缀合并。

def longest_common_prefix(strs):
    if not strs:
        return ""
    return divide_conquer(strs, 0, len(strs) - 1)

def divide_conquer(strs, left, right):
    if left == right:
        return strs[left]
    else:
        mid = (left + right) // 2
        lcp_left = divide_conquer(strs, left, mid)
        lcp_right = divide_conquer(strs, mid + 1, right)
        return common_prefix(lcp_left, lcp_right)

def common_prefix(left, right):
    min_len = min(len(left), len(right))
    for i in range(min_len):
        if left[i] != right[i]:
            return left[:i]
    return left[:min_len]

解法四:二分查找 将问题转化为寻找最短字符串的最长公共前缀。通过二分查找的方式,每次找到中间长度,判断最短字符串的前半部分是否为所有字符串的公共前缀,如果是,则最长公共前缀一定在后半部分,否则在前半部分。

def longest_common_prefix(strs):
    if not strs:
        return ""
    min_len = min(len(string) for string in strs)
    low, high = 0, min_len
    while low < high:
        mid = (low + high + 1) // 2
        if is_common_prefix(strs, mid):
            low = mid
        else:
            high = mid - 1
    return strs[0][:low]

def is_common_prefix(strs, length):
    prefix = strs[0][:length]
    for string in strs:
        if not string.startswith(prefix):
            return False
    return True

解法五:字典树(Trie) 使用字典树存储字符串,从根节点开始遍历,直到找到第一个非公共前缀的节点,返回路径上的字符串。

class TrieNode:
    def __init__(self):
        self.children = {}
        self.is_end = False

def longest_common_prefix(strs):
    if not strs:
        return ""
    root = TrieNode()
    for string in strs:
        node = root
        for char in string:
            if char not in node.children:
                node.children[char] = TrieNode()
            node = node.children[char]
        node.is_end = True
    prefix = ""
    while root and not root.is_end:
        if len(root.children) == 1:
            char, child = root.children.popitem()
            prefix += char
            root = child
        else:
            break
    return prefix

标签:return,前缀,python,string,len,strs,prefix,解法,left
From: https://blog.51cto.com/lzning/8944379

相关文章

  • 利用Python select模块实现多路I/O复用
    在开发网络服务时,能够同时处理多个网络连接是非常重要的。传统的方法是为每个连接创建一个新线程或进程,但这在大规模时可能会导致资源耗尽。更高效的做法是使用I/O多路复用,让一个线程能够监视多个文件描述符的状态变化。在Python中,我们可以通过select模块来实现这一功能。本文将介......
  • python之列表常用方法
    常用方法:函数名说明len(list)返回列表元素个数max(list)返回列表中元素最大值min(list)返回列表中元素最小值list(tup)将元组转换为列表list.append(obj)添加obj对象到列表的末尾list.count(obj)返回obj在列表中出现的次数list..extend(seq)在列表中添加指定序列(是序列,不单只列表),函......
  • python基础007----递归函数&闭包&装饰器
    一、递归函数1、递归函数概念    直接或间接的调用自身的函数,称为递归函数。每调用一次自身,相当于复制一份该函数,只不过参数有变化,参数的变化,就是重要的结束条件。2、递归函数实例#####递归函数######1、普通实现:计算n!=1*2*3*4*5*6*...*nn=int(input('普通实现阶乘,......
  • Python+Selenium框架实战系列003----测试数据分离与ddt技术&断言
    一、测试数据分离1、新建testData文件夹,新建login_data.py文件,如下所示:   2、在login_datas.py文件中存放测试用例数据,如下所示:#正常场景success_data={"mobile":"17839196010","pwd":"duhui94619"}#异常用例--手机号异常phone_data=[{"mobile":&......
  • python自动化学习笔记5-----allure测试报告
    1、运行测试报告 2、allure注解的使用  3、优化测试报告之添加对应的标签 4、注解的使用     5、yaml文件格式 6、更改logo(1)allure目录下找到allure.yml的文件,增加插件    (2)在插件目录下添加要展示的图片    (3)修改styles.cs......
  • python自动化学习笔记6-----jekins环境搭建及使用
        msi版本安装后,要去电脑服务里面设置为自启动,否则重启电脑后使用不了。  web自动化1、实现linux部署jekins,window运行自动化代码,不在同一个机器上运行在执行机(自己的电脑上)访问jekins网址进行相应设置        运行后,进行连接,连接成功后,小......
  • python自动化学习笔记4-----pytest单元测试框架
            ......
  • Plotly,一个超强的Python可视化库!
    数据可视化是数据分析和探索的一个重要方面,它有助于深入了解数据集中的潜在模式、趋势和关系。Plotly则是一个功能强大且多功能的Python库,提供了广泛的工具来创建交互式且具有视觉吸引力的绘图。它支持多种图表类型,包括散点图、折线图、条形图等。Plotly的独特之处在于它能......
  • 封装Detours用于Python中x64函数hook
    Detours代码仓库:https://github.com/microsoft/Detoursx64写一个任意地址hook要比x86麻烦的多,所以这里直接封装框架来用于x64的hook。Detours是微软发布的一个APIhook框架,同时支持x86和x64,看文档说也支持ARM和ARM64的Windows。编译文档Detours翻了下github,并没有发现什么编......
  • 搭建 OpenCV 的 Python 开发环境
    一.安装Anaconda Anaconda(官方网站)就是可以便捷获取包且对包能够进行管理,同时对环境可以统一管理的发行版本。Anaconda包含了conda、Python在内的超过180个科学包及其依赖项。 1.下载安装文件 官网下载太慢,好在有清华大学镜像站:https://mirrors.tuna.tsinghua.edu.cn/......