Leetcode 第14題 最長公共前綴

本文原地址在我的博客:Leetcode 第14題 最長公共前綴

題目地址??:https://leetcode.cn/problems/longest-common-prefix/

0x01 題目內容

編寫一個函數(shù)來查找字符串數(shù)組中的最長公共前綴义屏。

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

示例 1:

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

輸入:strs = ["dog","racecar","car"]
輸出:""
解釋:輸入不存在公共前綴福也。

提示:

1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i] 僅由小寫英文字母組成

0x02 算法思路

同學教的一個非常妙的解法:

0x001 算法原理

<img src="https://cdn.jsdelivr.net/gh/hetaozdh/hetaozdh.github.io@pic/img/image-20220726114529799.png" alt="ASCII表格 來自維基百科" style="zoom: 50%;" />

Python中字符串是可以比較大小的,比較的規(guī)則是根據(jù)ASCII表來將字符串轉換成數(shù)組再按位比較涎显,舉幾個例子:

abc和bac比較

"abc"<"bac"

原因是通過查表,a、b藏否、c的數(shù)字編號分別為97、98充包、99副签。

abc -> [97, 98, 99]
bac -> [98, 97, 99]

從第一位開始比較,因為97 < 98基矮,直接得到"abc"<"bac"而不需要處理后面的部分

abc和aac進行比較

"abc">"aac"

abc -> [97, 98, 99]
aac -> [97, 97, 99]

從第一位開始比較淆储,有97 = 97,所以接著吧比較第二位家浇,很明顯有98 > 97本砰,得出"abc">"aac"

abcc和abc進行比較

"abcc">"abc"

abcc -> [97, 98, 99, 99]
abc -> [97, 98 ,99]

這次我們發(fā)現(xiàn),對比前三位都一樣的情況下钢悲,字符串a(chǎn)bc沒有第四位和abcc進行比較了点额。這時候就給abc的結尾補上空字符:

abc -> ['a', 'b', 'c', NUL] -> [97, 98, 99, 0]

空字符NUL對應編號為0,是ASCII表中最小的莺琳。

自然就有"abcc">"abc"

0x002 利用思路

通過比對字符串咖楣,可以把一個list[str](全是字符串的列表)進行排序,從而可以得到一個最大值和最小值芦昔。

max_str: str = max(strs)
min_str: str = min(strs)

應該有诱贿,在strs: list[str]中,max_str和min_str是“差得最遠”的(或區(qū)別最大的)咕缎。二者的最長公共前綴(具有相似特征)應該也是strs中每一項的最長公共前綴珠十。

使用縱向掃描求max_str和min_str的最長公共前綴。

即設變量lcp: str凭豪。下標從0開始掃描兩個字符串焙蹭,若相同則將該位字符加入lcp尾部,若不同則跳出循環(huán)嫂伞,返回lcp孔厉。

0x03 算法實現(xiàn)

Python代碼

# 最長公共前綴
# 14 longest-common-prefix
# Code By 吃核桃不吐核桃殼

# leetcode submit region begin(Prohibit modification and deletion)


class Solution:
    @staticmethod
    def longestCommonPrefix(strs: list[str]) -> str:
        lcp: str = ''
        max_str: str = max(strs)
        min_str: str = min(strs)
        len_str: int = min(len(max_str), len(min_str))
        for num in range(len_str):
            if max_str[num] == min_str[num]:
                lcp += max_str[num]
            else:
                break
        return lcp

# leetcode submit region end(Prohibit modification and deletion)

順便說下python3.6之后支持了類型注解,代碼寫出來規(guī)范而且很漂亮帖努,有效增加了可讀性撰豺。

使用typing庫還可以自定義數(shù)據(jù)類型和數(shù)據(jù)類型別名。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末拼余,一起剝皮案震驚了整個濱河市污桦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌匙监,老刑警劉巖凡橱,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件小作,死亡現(xiàn)場離奇詭異,居然都是意外死亡稼钩,警方通過查閱死者的電腦和手機顾稀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坝撑,“玉大人础拨,你說我怎么就攤上這事∩茉兀” “怎么了诡宗?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長击儡。 經(jīng)常有香客問我塔沃,道長,這世上最難降的妖魔是什么阳谍? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任蛀柴,我火速辦了婚禮,結果婚禮上矫夯,老公的妹妹穿的比我還像新娘鸽疾。我一直安慰自己,他們只是感情好训貌,可當我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布制肮。 她就那樣靜靜地躺著,像睡著了一般递沪。 火紅的嫁衣襯著肌膚如雪豺鼻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天款慨,我揣著相機與錄音儒飒,去河邊找鬼。 笑死檩奠,一個胖子當著我的面吹牛桩了,可吹牛的內容都是我干的。 我是一名探鬼主播埠戳,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼井誉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了乞而?” 一聲冷哼從身側響起送悔,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎爪模,沒想到半個月后欠啤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡屋灌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年洁段,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片共郭。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡祠丝,死狀恐怖,靈堂內的尸體忽然破棺而出除嘹,到底是詐尸還是另有隱情写半,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布尉咕,位于F島的核電站叠蝇,受9級特大地震影響,放射性物質發(fā)生泄漏年缎。R本人自食惡果不足惜悔捶,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望单芜。 院中可真熱鬧蜕该,春花似錦、人聲如沸洲鸠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扒腕。三九已至淤齐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間袜匿,已是汗流浹背更啄。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留居灯,地道東北人祭务。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像怪嫌,于是被迫代替她去往敵國和親义锥。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內容

  • 自己的解法 自己的解法就是先找出長度最短的字符串岩灭,然后以這個字符串為基準拌倍,去遍歷其它字符串,看大家的前幾位是否是相...
    justonemoretry閱讀 89評論 0 0
  • 題目描述: 編寫一個函數(shù)來查找字符串數(shù)組中的最長公共前綴。 如果不存在公共前綴柱恤,返回空字符串 ""数初。 示例 1: ...
    卑微的潛行者閱讀 147評論 0 0
  • 14.最長公共前綴 編寫一個函數(shù)來查找字符串數(shù)組中的最長公共前綴。 如果不存在公共前綴梗顺,返回空字符串""泡孩。 示例1...
    不愛去冒險的少年y閱讀 268評論 0 0
  • 編寫一個函數(shù)來查找字符串數(shù)組中的最長公共前綴 https://leetcode-cn.com/problems/l...
    Shimmer_閱讀 151評論 0 1
  • 描述 給你一個長度為 nn 的字符串數(shù)組 strsstrs , 編寫一個函數(shù)來查找字符串數(shù)組中的最長公共前綴,返回...
    洛珎閱讀 185評論 0 0