【每日力扣Leetcode】14-查找字符串数组中的最长公共前缀

力扣题库14,查找字符串数组中的最长公共前缀。

题目链接点这里

题目描述

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 “”。

示例 1:

输入: [“flower”,“flow”,“flight”]
输出: “fl”
示例 2:

输入: [“dog”,“racecar”,“car”]
输出: “”
解释: 输入不存在公共前缀。
说明:

所有输入只包含小写字母 a-z 。

解题思路

一看这道题就会涉及到遍历操作。做了几道力扣题目之后发现,涉及到遍历或者是递归这种非常耗时的操作,一定要尽量思考如何能够提前进行结果的返回,最典型的就是题目110《【每日力扣Leetcode】110-判断一个二叉树是不是平衡二叉树》

这里我想的是如果在遍历的过程中已经确定公共前缀不存在了就不用继续遍历了,于是可以从下标0开始,每比较一次就更新一次当前的前缀,然后用前缀去和下一个元素比较。一旦前缀长度变为零就表明没有公共前缀,退出循环。

循环体中就是比较两个字符串的公共前缀,能想到的就是从下标0开始遍历,逐个比较两字符串的每个元素是否相等。

初始答案

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        def strPrefix(str1: str,str2: str) -> str:
            len1 = len(str1)
            len2 = len(str2)
            if len1 == 0 or len2 == 0:
                return ""
            for i in range(min(len1,len2)):
                if str1[i] == str2[i]:
                    i+=1
                else:
                    return str1[:i]
            return str1[:i]
        if len(strs)==0:
            return ""
        if len(strs)==1:
            return strs[0]
        prefix = strs[0]
        for i in range(1,len(strs)):
            prefix=strPrefix(prefix,strs[i])
            if len(prefix)==0:
                return prefix 
        return prefix

最坏情况下,假设最短字符串的长度为m,字符串个数为n,每个字符串都遍历一遍,时间复杂度为O(mn)。提交之后执行用时: 48 ms,超过了31%的提交。

改进答案

初始答案是用的横向对比,答案中还有一个纵向对比,其中很巧妙的运用了python中set数据不会有重复元素的特性来进行查重。

从下标0开始,获取所有字符串的单个字符放进一个set中,如果set的长度为1说明所有元素都相同。不过这里需要注意的是,假如其中有个字符串已经不能获取下个字符了就会报错,所以要用下try结构。

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        if len(strs)==0:
            return ""
        if strs[0]=="":
            return ""
        for i in range(len(strs[0])):
            try:
                temp=set([item[i] for item in strs])
            except Exception as e:
                return strs[0][:i]
            if not len(temp)==1:
                return strs[0][:i]
        return strs[0]

这里利用了列表生成器来将所有字符串的单个字符放进一个list中,然后转为set。如果这一步操作报错说明有字符串到头了,就不用再继续往下了,直接返回当前的前缀即可。

时间复杂度的话其实和上面一样也是O(mn),但是提交以后发现执行用时: 40 ms,击败了76%的提交,看来这个python自带的列表生成器还是挺省时的。

注意事项

从这个题目可以看出来python的一些内置方法都是经过优化的,又想到之前在学KMP算法的时候其实就是为了实现python中字符串的find方法,但是据说find方法也是经过优化的,这里我还没有测试过。不过不考虑算法实现的话,能够使用内置方法就尽量去使用。

网上还有些花里胡哨的思路,二分法啥的,除了秀操作感觉没有必要。

我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我,如果有问题欢迎在底下的评论区交流,谢谢。

### 回答1: Active Directory服务是种由微软公司开发的网络服务,它提供了种集中管理和控制网络资源的方式。它可以在中集中管理用户、计算机、应用程序和其他网络资源,从而提高了网络的安全性和可管理性。Active Directory服务还提供了些高级功能,如单点登录、组策略管理和名系统(DNS)集成等,使得网络管理员可以更加轻松地管理和维护网络。 ### 回答2: Active Directory服务(Active Directory Domain Services,简称AD DS)是微软公司的项用于管理和组织网络资源的目录服务。它是种基于LDAP(轻量级目录访问协议)的目录服务,可以让用户和管理员方便地管理和访问网络中的资源。 AD DS的主要功能包括用户身份认证、访问控制、组管理和资源管理等。通过AD DS,管理员可以集中管理和配置用户和计算机的访问权限,确保系统安全。同时,AD DS还提供了的集中管理功能,管理员可以通过控制器管理中的所有对象,并在中实施策略。 AD DS还支持单点登录功能,用户只需在登录到之后,即可自动访问到所属中的资源,而无需再次输入用户名和密码。这大大提高了用户的工作效率。 此外,AD DS还支持多架构,可以通过建立信任关系实现跨资源的访问和管理。管理员可以维护多个之间的信任关系,实现用户和资源的统管理。 总而言之,AD DS是种强大的目录服务,可以实现用户和资源的集中管理和访问控制,提高网络系统的稳定性和安全性。它是企业网络管理的重要组成部分,为企业提供了高效的身份认证和资源管理功能,增强了企业的生产力和安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值