Python 字符串匹配(1):暴力匹配(樸素匹配)

暴力匹配(brute-force substring search)就是用模式的字符串去和目標(biāo)文本的字符串盆繁,一個一個字符的匹配過去掀淘。時間復(fù)雜性為 O(m×n)。

這里兩種 Python 實現(xiàn)方法油昂,思路大同小異革娄,都是沿著目標(biāo)文本做遍歷,同時有一個小循環(huán)對模式字符串做遍歷冕碟。如果模式字符串能和目標(biāo)文本的子字符串一一對應(yīng)拦惋,就返回目標(biāo)文本的這個位置的下標(biāo)。兩種方法都使用了兩個針對目標(biāo)文本字符串的指針i安寺,以及模式字符串的指針j厕妖。區(qū)別是外層指針是否隨著內(nèi)層指針一起前進(jìn)。

方法1

兩個 while 循環(huán)嵌套挑庶,參考Algorithms 4th, Robert Sedgewick, page 760言秸。在內(nèi)層指針前進(jìn)時,外層指針不動迎捺,直到內(nèi)從指針循環(huán)完以后才前進(jìn)一位举畸。

def brute_force_search(txt, pattern):
    N = len(txt)
    M = len(pattern)

    i = 0   # pointer into the text
    while i <= (N - M):
        j = 0       # pointer into the patter
        while j < M:
            if txt[i+j] != pattern[j]:
                break
            j += 1
        if j == M:
            return i
        i += 1
    return -1

def main():
    txt = "abcde"
    pat = "cde"
    result = brute_force_search(txt, pat)
    print "result:", result

    txt_another = "abcde"
    pat_another = "123"
    result_another = brute_force_search(txt_another, pat_another)
    print "result_another:", result_another
    
if __name__ == '__main__':
    main()

結(jié)果是

result: 2
result_another: -1

方法2

只有一個 while,但也是控制兩個指針凳枝。如果不匹配抄沮,目標(biāo)文本字符串的指針向前走一位,而模式字符串的指針會到下標(biāo) 0 的位置岖瑰。這種方法相當(dāng)于上一種方法的改進(jìn)型叛买,特點是兩個指針一起前進(jìn)。

參考數(shù)據(jù)結(jié)構(gòu)與算法:Python語言描述蹋订,第114頁聪全。但是這里做了修改,查找到以后立即就做了返回辅辩,而不是書上遍歷完以后才返回难礼。

def naive_search(txt, pattern):
    N = len(txt)
    M = len(pattern)

    i = 0   # pointer into text
    j = 0   # pointer into pattern

    while i < N and j < M:
        if txt[i] == pattern[j]:
            i += 1
            j += 1
            if j == M:
                return (i-j)
        else:
            i = i - j + 1
            j = 0
    return -1

def main():
    txt = "abcde"
    pat = "cde"
    naive_result = naive_search(txt, pat)
    print "naive_result:", naive_result

    txt_another = "abcde"
    pat_another = "123"
    naive_result_another = naive_search(txt_another, pat_another)
    print "naive_result_another:", naive_result_another

if __name__ == '__main__':
    main()

結(jié)果是

naive_result: 2
naive_result_another: -1

書上的示例代碼也是一樣的效果娃圆,區(qū)別是把 if i == m: 放在循環(huán)外面。實際上蛾茉,當(dāng)匹配到字符串的時候讼呢,程序會跳出 while 循環(huán),所以結(jié)果一致谦炬。


def naive_matching(t, p):
    j, i = 0, 0
    n, m = len(t), len(p)
    while j < n and i < m:  # i==m means a matching
        if t[j] == p[i]: # ok! consider next char in p
            j, i = j+1, i+1
        else:            # no! consider next position in t
            j, i = j-i+1, 0
    if i == m: # find a matching, return its index
        return j-i
    return -1  # no matching, return special value

def main():
    txt = "abcde"
    pat = "cde"
    naive_matching_result = naive_matching(txt, pat)
    print "naive_matching_result:", naive_matching_result 

    txt_another = "abcde"
    pat_another = "123"
    naive_matching_result_another = naive_matching(txt_another, pat_another)
    print "naive_matching_result_another:", naive_matching_result_another 

if __name__ == '__main__':
    main()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末悦屏,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子键思,更是在濱河造成了極大的恐慌础爬,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吼鳞,死亡現(xiàn)場離奇詭異看蚜,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)赔桌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門供炎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人疾党,你說我怎么就攤上這事音诫。” “怎么了雪位?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵竭钝,是天一觀的道長。 經(jīng)常有香客問我雹洗,道長香罐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任队伟,我火速辦了婚禮穴吹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嗜侮。我一直安慰自己港令,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布锈颗。 她就那樣靜靜地躺著顷霹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪击吱。 梳的紋絲不亂的頭發(fā)上淋淀,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機(jī)與錄音覆醇,去河邊找鬼朵纷。 笑死炭臭,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的袍辞。 我是一名探鬼主播鞋仍,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼搅吁!你這毒婦竟也來了威创?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤谎懦,失蹤者是張志新(化名)和其女友劉穎肚豺,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體界拦,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡吸申,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了寞奸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呛谜。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡在跳,死狀恐怖枪萄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情猫妙,我是刑警寧澤瓷翻,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站割坠,受9級特大地震影響齐帚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜彼哼,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一对妄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧敢朱,春花似錦剪菱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蚓哩,卻和暖如春构灸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背岸梨。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工喜颁, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留稠氮,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓半开,卻偏偏與公主長得像括袒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子稿茉,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,234評論 0 4
  • 我獨自坐著锹锰,好冷,心像凍結(jié)的大海漓库,因為支付寶里的錢又莫名其妙見底了恃慧。 正在和媽媽周旋,給打點錢渺蒿,錢啊.....想著...
    musclemuseumtea閱讀 157評論 0 0
  • 素箋淡雅寫不下詩意的綿長 淡墨清香潑不盡琴音的悠揚 我如一葉水中孤舟 追尋昨日的春光痢士,漂泊四方 又似一縷月下微風(fēng) ...
    梓銘小友閱讀 262評論 0 0
  • 玉漏銅壺且莫催,鐵關(guān)金鎖徹夜開; 誰家見月能閑坐茂装,何處...
    MU心閱讀 809評論 0 1
  • 愛怠蹂,禁不起等待(感恩那些愛我的家人)踏在歲月的長廊,回想以往的時光少态,可曾記得幼年時誰給了你細(xì)心的照顧城侧,可曾記得求學(xué)...
    不忘初心_f2f8閱讀 272評論 0 0