LeetCode 28. 實現(xiàn) strStr()

28. 實現(xiàn) strStr()


題目來源:https://leetcode-cn.com/problems/implement-strstr

題目


實現(xiàn) strStr() 函數(shù)。

給定一個 haystack 字符串和一個 needle 字符串猪半,在 haystack 字符串中找出 needle 字符串出現(xiàn)的第一個位置 (從0開始)和二。如果不存在,則返回 -1亮元。

示例 1:

輸入: haystack = "hello", needle = "ll"
輸出: 2

示例 2:

輸入: haystack = "aaaaa", needle = "bba"
輸出: -1

說明:

當 needle 是空字符串時,我們應(yīng)當返回什么值呢?這是一個在面試中很好的問題戈轿。

對于本題而言症副,當 needle 是空字符串時我們應(yīng)當返回 0 店雅。這與C語言的 strstr() 以及 Java的 indexOf() 定義相符政基。

解題思路


思路:雙指針

算法:

  • 先找到 haystack 子串中第一個字符與 needle 字符串第一個字符相同的位置,從這里開始進行匹配闹啦;
  • 逐個進行匹配沮明,當出現(xiàn)不匹配的字符時,考慮回溯窍奋,將 p 指針重置為此次匹配開始的下一位荐健,即是 p - cur_len + 1;
  • 重復(fù)上面的過程琳袄,若完全匹配江场,則返回匹配子串的起始坐標,即是 p - N窖逗;最終都不匹配扛稽,則返回 -1。

(p 是指向 haystack 字符的指針滑负,q 是指向 needle 字符的指針在张,M 表示 haystack 字符的長度,N 表示 needle 字符的長度矮慕,cur_len 表示字符匹配的長度)

具體的過程如下圖所示:

圖解

代碼實現(xiàn)


class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        M, N = len(haystack), len(needle)
        if N == 0:
            return 0
        
        p = 0

        while p < M - N + 1:
            # 跳過子串首字符與 needle 首字符不同的字符
            while p < M - N + 1 and haystack[p] != needle[0]:
                p += 1
            
            cur_len = 0
            q = 0
            
            # 開始匹配
            while q < N and p < M and haystack[p] == needle[q]:
                p += 1
                q += 1
                cur_len += 1
            
            # 完全匹配帮匾,返回結(jié)果
            if cur_len == N:
                return p - N
            # 不匹配,回溯痴鳄,重新匹配
            p = p - cur_len + 1

        return -1

實現(xiàn)結(jié)果


實現(xiàn)結(jié)果

以上就是使用雙指針的方法瘟斜,先找到子串與給定字符首字符相同的位置,同時遍歷痪寻,子串與字符進行匹配螺句,當不匹配時進行回溯,直到遍歷結(jié)束橡类,進而解決《實現(xiàn) strStr()》 問題的主要內(nèi)容蛇尚。


歡迎關(guān)注微信公眾號《書所集錄》

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市顾画,隨后出現(xiàn)的幾起案子取劫,更是在濱河造成了極大的恐慌,老刑警劉巖研侣,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谱邪,死亡現(xiàn)場離奇詭異,居然都是意外死亡庶诡,警方通過查閱死者的電腦和手機惦银,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人扯俱,你說我怎么就攤上這事书蚪。” “怎么了蘸吓?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵善炫,是天一觀的道長撩幽。 經(jīng)常有香客問我库继,道長,這世上最難降的妖魔是什么窜醉? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任宪萄,我火速辦了婚禮,結(jié)果婚禮上榨惰,老公的妹妹穿的比我還像新娘拜英。我一直安慰自己,他們只是感情好琅催,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布居凶。 她就那樣靜靜地躺著,像睡著了一般藤抡。 火紅的嫁衣襯著肌膚如雪侠碧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天缠黍,我揣著相機與錄音弄兜,去河邊找鬼。 笑死瓷式,一個胖子當著我的面吹牛替饿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播贸典,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼视卢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了廊驼?” 一聲冷哼從身側(cè)響起腾夯,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蔬充,沒想到半個月后蝶俱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡饥漫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年榨呆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片庸队。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡积蜻,死狀恐怖闯割,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情竿拆,我是刑警寧澤宙拉,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站丙笋,受9級特大地震影響谢澈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜御板,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一锥忿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧怠肋,春花似錦敬鬓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至杈抢,卻和暖如春数尿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背春感。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工砌创, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鲫懒。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓嫩实,卻偏偏與公主長得像,于是被迫代替她去往敵國和親窥岩。 傳聞我的和親對象是個殘疾皇子甲献,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

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