编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串""。
示例 1:
输入: ["flower","flow","flight"]输出:"fl"
示例 2:
输入: ["dog","racecar","car"]输出:""解释:输入不存在公共前缀。
说明:
所有输入只包含小写字母a-z。
读题:给了一个列表,由字符串组成,要求返回最长公共前缀。
那就先找出最短的一个字符串,比较前N项,
感觉是一个一个样例测试,定义方法。改了两个小时。
首先是列表为空,返回空字符串,
然后是列表中有空字符串的,一定是没有公共前缀,返回发字符串
接下来是去重后长度唯一,那么原列表就是只有一个元素,还有就是所有元素都相同,返回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还没用上,最短元素就是在长公共前缀了。
一步一个坎,太费劲了,研究一下别人的
先是判断存不存在strs,然后排序,让s1等于排序后第一位,s2等于排序后最后一位
这个排序可太妙了,依照单词顺序排序,比较第一位后最后一位公共元素就行,
这个方法返回一个可遍历对象,如
i为下标,x为元素,对比s1和s2每一位同下标元素,
如果不同,这里用一个十分取巧的方法,【:i】!!!!返回前i项,而在比较时一直比较[ i ],并且
[ : 0]表示空字符串
如果全相同,就返回s1。
相当服气,NB
再学习一个
这个关键就是zip函数,却且的说是zip(*)
zip这个解释太长就不粘贴了,随便说一下,zipj就是压缩的意思,压缩的内容是多个迭代对象,返回一个对象,节约内存。可以转化为list,而zip(*)就是解压。看一下示例就知道了
很容易理解,不讲了