LeetCode专题-Python实现之第14题:Longest Common Prefix
相关代码已经上传到github:https://github.com/exploitht/leetcode-python
文中代码为了不动官网提供的初始几行代码内容,有一些不规范的地方,比如函数名大小写问题等等;更合理的代码实现参考我的github repo
1、读题
Write a function to find the longest common prefix string amongst an array of strings.
很简单的一句话,寻找一个字符串数组的最大公共前缀字符子串
举个简单的例子,如下字符串列表:
['abc', 'abcd', 'abd']
的最大公共前缀是'ab'
2、解题
最简单粗暴的方式,遍历嘛,搞一个前缀,前缀从短变长,去匹配整个字符串数组,就能找到公共前缀。基于这种思路,有了如下代码:
class Solution(object):
    def longestCommonPrefix(self, strs):
        """
        :type strs: List[str]
        :rtype: str
        """
        # 空列表判断
        if not strs:
            return ''
        # 取第一个字符串来寻找前缀
        first_str = strs[0]
        prefix = ''
        for i in range(len(first_str)):
            prefix = first_str[:i + 1]
            # 如果strs中每一个字符串都是以prefix开头,那么prefix就是前缀
            if all(map(lambda x: x.startswith(prefix), strs)):
                continue
            else:
                break
        else:
            return prefix
        return prefix[:-1]
3、第一次优化
上面这种实现方式用一次循环来取出一个前缀,然后循环遍历字符串数组判断前缀是否正确,也就是O(n2)的时间复杂度(n的平方)
能不能优化一点呢,思考有序比无序简单,是否可以先排序?Python的sorted函数排序性能可是杠杠的,Timsort算法在最坏情况也有n log n的表现,快排一般也是这个复杂度,但是最坏情况是n平方。
如果有序,怎样寻找前缀呢?观察一个有序的例子:['abcd','abce','abd','ad'],第一个和第二个比较,能够得到的子串一般相对较长,但是越往后呢,对了,不会变长,只会变短或者不变。也就是首尾对比就能够得到结果。于是乎有了下面解题方式:
class Solution(object):
    def longestCommonPrefix(self, strs):
        """
        :type strs: List[str]
        :rtype: str
        """
        # 如果字符串数组为空,或者有一个元素但是是空字符串,则返回空字符串
        # 先排序
        strs_list = sorted(strs)
        if not strs or not strs[0]:
            return ''
        # # 先排序
        # strs_list = sorted(strs)
        # 前缀初始化为空字符串,然后循环递增
        prefix = ''
        for i in range(len(strs_list[0])):
            prefix = strs_list[0][:i + 1]
            # 判断排序后的字符串数组首尾是否有公共前缀,all判断比and快
            # if all([strs_list[0].startswith(prefix), strs_list[-1].startswith(prefix)]):
            if strs_list[0].startswith(prefix) and strs_list[-1].startswith(prefix):
                continue
            else:
                # 不满足if,也就是prefix多加了一位的情况,对应最后一行的 return prefix[:-1]
                break
        else:
            # 不是break结束循环,则执行这里
            return prefix
        return prefix[:-1]
如上实现,排序的时间复杂度是O(n)或者O(n log n),寻找子串的时间复杂度是O(n)级别,合在一起也就是O(n)或者O(n + n log n)
LeetCode专题-Python实现之第14题:Longest Common Prefix的更多相关文章
- Leetcode算法刷题:第14题 Longest Common Prefix
		Longest Common Prefix 题目 给予一个列表,元素为字符串,写一个程序找出最长公共前缀 解题思路 先比较两个字符串,如果第一个字符不一样,则返回空值,比较完成后,用这个公共字符串和下 ... 
- leetcode第14题--Longest Common Prefix
		Problems:Write a function to find the longest common prefix string amongst an array of strings. 就是返回 ... 
- LeetCode专题-Python实现之第13题:Roman to Integer
		导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ... 
- LeetCode专题-Python实现之第28题: Implement strStr()
		导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ... 
- LeetCode专题-Python实现之第27题:Remove Element
		导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ... 
- LeetCode专题-Python实现之第26题:Remove Duplicates from Sorted Array
		导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ... 
- LeetCode专题-Python实现之第21题:Merge Two Sorted Lists
		导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ... 
- LeetCode专题-Python实现之第20题:Valid Parentheses
		导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ... 
- LeetCode专题-Python实现之第9题:Palindrome Number
		导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ... 
随机推荐
- PHP序列号生成函数和字符串替换函数代码
			/** * 序列号生成器 */ function snMaker($pre = '') { $date = date('Ymd'); $rand = rand(1000000,9999999); $t ... 
- PowerApp Document
			https://docs.microsoft.com/en-us/powerapps/ PowerApp Document: https://docs.microsoft.com/en-us/powe ... 
- esxi 精简置备只增不减问题解决方法(转)
			esxi 精简置备只增不减问题解决方法 众所周知Thin Provisioning模式下的虚拟机磁盘的空间会随需增长,可以很大程度上帮助我们节约空间,可是,凡增长过后的空间,即使清除了导致增长的文件后 ... 
- 2018年10月OKR初步规划
			OKR(Objectives and Key Results)即目标+关键结果,是一套明确和跟踪目标及其完成情况的管理工具和方法 今天是十月的第一个工作日,也是我归零的第一天,受到一位前辈的启发,我决 ... 
- GYM 101617 F
			说到这题还要提到周日下午训练赛,都进去了hmc说他这场单切过准备换一场. 很不幸的是我当时已经开了这个几何题, 开场就开几何是什么鬼啊!!! 给你n个圆,找一点在所有园内并且离原点最远.(保证有解) ... 
- 最基础的Eureka服务和注册搭建
			Eureka服务端 打开IDEA,新建项目 选择"next",写上组织名(Group)和项目名(Artifact) 选择如下选项,然后一直下一步,创建好项目. 删除不必要的文件 添 ... 
- react-quill  富文本编辑器 ---- 图片处理
			import React,{Component} from 'react'; import ReactQuill,{ Quill } from 'react-quill'; import 'react ... 
- ubuntu系统下手动安装autoconf安装包
			首先简单介绍一下autoconf.Autoconf是一个可以适应多种unix类系统的shell脚本的工具. 我在往虚拟机中安装应用时,需要用到该工具,于是想下载一个.但是由于系统内核版本低,已不能用a ... 
- B4 and After: Managing Hierarchy, Partitioning, and Asymmetry for Availability and Scale in Google’s Sofware-Defined WAN
			B4及之后:为谷歌软件定义WAN的可用性和扩展管理层次化.划分和不对称 本文为SIGCOMM 2018会议论文,由谷歌提供. 笔者翻译了该论文.由于时间仓促,且笔者英文能力有限,错误之处在所难免:欢迎 ... 
- [python] bluepy 一款python封装的BLE利器
			1.bluepy 简介 bluepy 是github上一个很好的蓝牙开源项目,其地址在 LINK-1, 其主要功能是用python实现linux上BLE的接口. This is a project t ... 
