題目及要求:
編寫一個函數來查找字符串數組中的最長公共前綴。
如果不存在公共前綴,返回空字符串 ""
。
示例 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]
這個通過了,雖然不是自己想到的方法,但是還是可恥的放個圖吧。