题目及要求:
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""
。
示例 1:
输入: ["flower","flow","flight"] 输出: "fl"
示例 2:
输入: ["dog","racecar","car"] 输出: "" 解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z
。
思路:
看到题目的时候,第一想法是要用需要用到列表的切片,而且肯定是要遍历切片的,但是怎么求得strs里面元素每个元素的最小值呢???这是一个问题,然后我用了len(strs[i][m])的形式,来求最小值,后来自己运行之后再看出来,这个长度就是1,蠢哭。
在我尝试了n边,而且最后在LeetCode上面都运行错误的时候,我放弃了自己思考,转向了网络,怎么去寻求前人的知识,在看了一些文章以后,我决定以这个文章作为参考 Python实现-14.最长公共前缀,看到里面的方法之后,我有了大致的方向,于是我动手开始编码。。。。
class Solution: def longestCommonPrefix(self, strs): """ :type strs: List[str] :rtype: str """ m=0 list1=[] list2=[] if len(strs)==0: return "" else: min_num = min([len(x) for x in strs])#求得最小的字符串长度 if strs[0]=="": return "" while m<min_num: for i in range(len(strs)): if strs[i][m]==strs[i-1][m]: list1.append(strs[i][m]) m=m+1 for i in list1: if list1.count(i)==len(strs): if i not in list2: list2.append(i) elif len(strs)==len(strs)*min_num: if list1.count(i)==len(strs): if i not in list2: list2.append(i) else: if list1.count(i)==len(strs)*min_num: list2=strs[0] return "".join(list2)
以上代码长也就算了,居然还是报错了,恩,在LeetCode上面错误的位置进行修改还是通过不了,o(╥﹏╥)o,我已放弃思考。
重新再看了一遍文章,我决定按照第二个方法去编码。我要站在巨人的肩上看世界。
class Solution: def longestCommonPrefix(self, strs): """ :type strs: List[str] :rtype: str """ m=0 if len(strs)==0:#当为空列表时 return "" else: min_num = min([len(x) for x in strs])#求出最小的长度 if len(strs)==1:#当字符串为""和只有只有1个字符串时 return strs[0] while m<min_num: for i in range(len(strs)): if strs[i][m]!=strs[i-1][m]:#此处如果用i+1后续会报出out of range的情况 return strs[0][:m]#此处表明以strs里面的第一个字符串为参照,当存在m时,返回 #m前面的字符 m+=1 return strs[0][:m]
这个通过了,虽然不是自己想到的方法,但是还是可耻的放个图吧。