最长公共前缀

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

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

示例 1:

输入: ["flower","flow","flight"]输出:"fl"

示例 2:

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

说明:

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


最长公共前缀_第1张图片

读题:给了一个列表,由字符串组成,要求返回最长公共前缀。

那就先找出最短的一个字符串,比较前N项,


最长公共前缀_第2张图片

感觉是一个一个样例测试,定义方法。改了两个小时。

首先是列表为空,返回空字符串,

然后是列表中有空字符串的,一定是没有公共前缀,返回发字符串

接下来是去重后长度唯一,那么原列表就是只有一个元素,还有就是所有元素都相同,返回strs[0]就行

其余的要开始我们的判断,首先定义一个空列表,遍历strs,计算长度然后添加给列表

这时列表存储的是和strs元素相同顺序的长度,其实用字典更直观一些,每个人都有自己喜欢用的,我就喜欢用列表,for循环之类。

然后Min方法找出最小值,按照其索引找出strs中对应的元素,这时我们就找到最短元素了。

开始准备比较,外层为遍历最短元素,内层为遍历strs,我们比较的是最短元素的前i位和其他元素前i位是否不同,用的是【:i】,所以i要从1开始,一直比较到最后一位,最后一位应该是

len(strs[a.index(c)] 为什么要加一呢?如a = '123456'   a[ : 6]     a[ : 1000]结果都是一样的

但是如果a = '1'    对于range就是(1,1),意义不明的写法,所以要加1

然后开始比较,如果最短元素的前i位在遍历时遇到不同了。那么就表明【:i-1】为最长公共前缀,让是如果i为1,那么就是第一就出现不同,就没有公共前缀,

这里我用的方法是找不同,那么就还有一种可能,遍历到最后一位还是没有不同

这说明说明呢,说明最短元素就是最长公共前缀,在外层循环定义一个num=0,每次对比一个元素就加一,一圈后归零,到最后一层时num == len(strs)表示strs中所有元素都对比完了,i == 最短元素长度表示对比完整个最短元素,到这个时候return还没用上,最短元素就是在长公共前缀了。

一步一个坎,太费劲了,研究一下别人的

最长公共前缀_第3张图片

先是判断存不存在strs,然后排序,让s1等于排序后第一位,s2等于排序后最后一位

这个排序可太妙了,依照单词顺序排序,比较第一位后最后一位公共元素就行,


最长公共前缀_第4张图片

这个方法返回一个可遍历对象,如

最长公共前缀_第5张图片

i为下标,x为元素,对比s1和s2每一位同下标元素,

如果不同,这里用一个十分取巧的方法,【:i】!!!!返回前i项,而在比较时一直比较[ i ],并且

[ : 0]表示空字符串

如果全相同,就返回s1。

相当服气,NB

再学习一个

最长公共前缀_第6张图片

这个关键就是zip函数,却且的说是zip(*)

zip这个解释太长就不粘贴了,随便说一下,zipj就是压缩的意思,压缩的内容是多个迭代对象,返回一个对象,节约内存。可以转化为list,而zip(*)就是解压。看一下示例就知道了

最长公共前缀_第7张图片

很容易理解,不讲了

你可能感兴趣的:(最长公共前缀)