Leetcode14 最長公共前綴(Python3)

題目:

編寫一個函數來查找字符串數組中的最長公共前綴。

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

示例 1:

輸入: ["flower","flow","flight"]
輸出: "fl"
示例 2:

輸入: ["dog","racecar","car"]
輸出: ""
解釋: 輸入不存在公共前綴。
說明:

所有輸入只包含小寫字母 a-z 。

Solution1

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        Column=tuple(t for t in zip(*strs))  #strs的每一個字符串排一行,左對齊,右端取最短者切平。
        print(Column)  #看看每一列的組合效果(注意Python的for迭代器必須轉爲容器類型纔會穩定[1])
        Kinds=tuple(len(set(t)) for t in Column)
        print(Kinds)   #每一列的字符種類數量
        for i,k in enumerate((*Kinds,2)):   #最後加個2作爲哨兵,因爲一旦迭代到2種及以上,就會return
            if k>1:return (*strs,"")[0][:i] #i是字符所在下標,k是對應列的字符種類數

第3行:

zip([iterable, ...])
zip()是Python的一個內建函數,它接受一系列可迭代的對象作爲參數,將對象中對應的元素打包成一個個tuple(元組),然後返回由這些tuples組成的list(列表)。
若傳入參數的長度不等,則返回list的長度和參數中長度最短的對象相同。利用*號操作符,可以將list unzip(解壓)。

如:

>>> list(zip('abc','def'))
[('a', 'd'), ('b', 'e'), ('c', 'f')]
>>> list(zip(['abc','def']))
[('abc',), ('def',)]
>>> list(zip(*['abc','def']))
[('a', 'd'), ('b', 'e'), ('c', 'f')]

Python 元組 tuple() 函數將列表轉換爲元組。

>>> Column=tuple(t for t in zip(*strs))
>>> Column
(('f', 'f', 'f'), ('l', 'l', 'l'), ('o', 'o', 'i'), ('w', 'w', 'g'))

>>> list(zip(*strs))
[('f', 'f', 'f'), ('l', 'l', 'l'), ('o', 'o', 'i'), ('w', 'w', 'g')]
>>> Column=tuple(zip(*strs))
>>> Column
(('f', 'f', 'f'), ('l', 'l', 'l'), ('o', 'o', 'i'), ('w', 'w', 'g'))

事實上,第三行可以改爲:

Column=tuple(zip(*strs))

第五行:

set() 函數創建一個無序不重複元素集,可進行關係測試,刪除重複數據,還可以計算交集、差集、並集等。

如:

>>> set(('f', 'f', 'f'))
{'f'}
>>> set(('f', 'f', 'f','d'))
{'f', 'd'}
>>> set('google')
{'e', 'l', 'o', 'g'}

之後通過tuple()函數轉換爲元組,故Kinds的最終輸出爲:

>>> Column
(('f', 'f', 'f'), ('l', 'l', 'l'), ('o', 'o', 'i'), ('w', 'w', 'g'))

>>> Kinds

(1,1,2,2)

 

第六行

*kinds中的*: 函數在調用多個參數時,在列表、元組、集合、字典及其他可迭代對象作爲實參,並在前面加 *.起到解包的作用。

>>> (*Kinds,2)
(1, 1, 2, 2, 2)
>>> (Kinds,2)
((1, 1, 2, 2), 2)

因爲for循環同時輸出i(index)和k,因此需要使用enumerate()函數;

enumerate() 函數用於將一個可遍歷的數據對象(如列表、元組或字符串)組合爲一個索引序列,同時列出數據和數據下標,一般用在 for 循環當中。

第7行

i是所在下標,因此[:i]即爲相同字符的範圍;

(*strs,"")[0]則是原始的字符串,從而滿足返回最長公共前綴的要求。

之所以在第6行添加2是爲了防止第七行無法出現k>1的情況。

 

總結

思想並不難,按順序進行比較即可;但是對python中zip, tuple,set等內置函數的應用,以及對可迭代對象的理解等挺難的。

參考:

https://leetcode-cn.com/problems/longest-common-prefix/solution/pythonyu-fa-lian-xi-4xing-jie-fa-by-java_lee/

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章