LeetCode-28.實現 strStr()(Implement strStr())

2021-03-02 極客算法

28. 實現 strStr()

實現C語言中的strStr()函數。

給定一個 haystack 字符串和一個 needle 字符串,在 haystack 字符串中找出 needle 字符串首次出現位置 (從0開始)。如果不存在,則返回 -1。

示例 1:

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

示例 2:

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

說明:

當 needle 是空字符串時,我們應當返回什麼值呢?這是一個在面試中很好的問題。

對於本題而言,當 needle 是空字符串時我們應當返回 0 。這與C語言的 strstr() 以及 Java的 indexOf() 定義相符。

來源:力扣(LeetCode)

連結:https://leetcode-cn.com/problems/implement-strstr/

Link:https://leetcode.com/problems/implement-strstr/

暴力破解

O(M*N)

逐個比較,如果不匹配,右移動一格
ABCDEFG -> ABCDEFG -> ABCDEFG -> ABCDEFG DEF DEF DEF DEF

代碼如下:

class Solution:    def strStr(self, haystack: str, needle: str) -> int:
if len(needle) > len(haystack): return -1
index = 0 for i in range(len(haystack) - len(needle) + 1): index = i for j in range(len(needle)): if needle[j] != haystack[i + j]: index = -1 break
if index == i: break
return index

Robin-karp算法

O(M + N), 如果哈希函數衝突很小的情況下, 不然就退化成暴力破解了

Robin-karp是對暴力破解的一個優化,將Pattern字符哈希取值。每次匹配只比較同長度字符串的哈希值。

如果哈希值相等,考慮到哈希衝突,需再次比較每一位字符。用來驗證結果。

ABCDEFGABC    --哈希值-->   Hash(ABC) BCD    --哈希值-->   Hash(BCD)  CDE    --哈希值-->   Hash(CDE)   ...     DEF    --哈希值-->   Hash(DEF)

比較同長哈希值, 如果相等,逐個比較驗證結果

hash(ABC)        hash(BCD)        hash(CDE)        hash(DEF)    !=               !=               !=               == (需驗證結果)hash(DEF)        hash(DEF)        hash(DEF)        hash(DEF)
ABCDEFG -> ABCDEFG -> ABCDEFG -> ABCDEFGDEF DEF DEF DEF

考慮到Hash的時間複雜度也是O(N), 那麼這個過程,並沒有優化時間複雜度,仍然是(M - N + 1)次比較, 每次哈希O(N)。

如果設計哈希函數如下, 就不必重複計算,每次去掉最高位,乘以K進位,再加上新的最低位

f(ABC) = A * K^2 + B * K^1 + C * K^0f(BCD) =           B * K^2 + C * K^1 + D * K^0
存在遞推關係:f(BCD) = (f(ABC) - A * k^2) * k + D

令k=256進位, 代碼如下:

k_buckets = 131k_characters = 256class Solution:    def strStr(self, haystack: str, needle: str) -> int:
m = len(haystack) n = len(needle)
if n == 0: return 0
if n > m: return -1
target = 0 tmp = 0 high = 1
for i in range(n - 1): high = (high * k_characters) % k_buckets
for i in range(n): tmp = (tmp * k_characters + ord(haystack[i])) % k_buckets target = (target * k_characters + ord(needle[i])) % k_buckets
for i in range(m - n + 1): index = i if tmp == target: for j in range(n): if haystack[i + j] != needle[j]: index = -1 break
if index == i: return index
if i < m - n: tmp = ((tmp - ord(haystack[i]) * high) * k_characters + ord(haystack[i + n])) % k_buckets
return -1

--End--

相關焦點

  • leetcode第28題-實現strStr()
    實現 strStr() 函數。給定一個 haystack 字符串和一個 needle 字符串,在 haystack 字符串中找出 needle 字符串出現的第一個位置 (從0開始)。如果不存在,則返回  -1。
  • 28 實現 strStr() 函數
    https://leetcode-cn.com/problems/implement-strstr/
  • 每日一道 LeetCode (9):實現 strStr()
    ❞前文合集每日一道 LeetCode 前文合集代碼倉庫GitHub:https://github.com/meteor1993/LeetCodeGitee:https://gitee.com/inwsy/LeetCode題目:實現
  • 【刷穿 LeetCode】28. 實現 strStr()(簡單)
    題目描述實現 strStr() 函數。
  • 算法養成記:實現 strStr()
    呆萌程式設計師算法養成記LeetCode28Implement strStr()Implement strStr().This is consistent to C's strstr() and Java's indexOf().中文意思就是:實現 strStr() 函數。
  • [函數] strstr、strrchr、substr、stristr四個函數的區別
    最後感謝你的關注今天要分享的PHP函數: strstr、strrchr、substr、stristr 函數php中strstr strrchr substr stristr這四個字符串操作函數特別讓人容易混淆,常用的是substr,strstr,基本上可以滿足對字符串的操作。
  • 【函數分享】PHP函數mb_strstr 分享
    mb_strstr () 查找字符串在另一個字符串裡的首次出現。 string mb_strstr(string$haystack,string$needle[,bool$before_needle=false[,string$encoding=mb_internal_encoding()]]) 說明: mb_strstr
  • 【複試上機】LeetCode-簡單-010-Implement strStr()(實現strStr函數)
  • 校招面試題:編寫 strcpy, strlen, strstr, atoi 等庫函數的題目
    實現 strlen,獲取字符串長度,代碼實現:2.實現 strcpy,字符串拷貝函數,代碼實現:3.實現 strstr,子串查找函數,代碼實現:eg: LeetCode problem: Implement strStr()4.
  • "暴力"字符匹配算法的C語言實現
    暴力字符匹配算法的實現原理還是非常簡單的,從第一個字符開始進行匹配,如果匹配不成功,移動到下一個字節重新開始逐個匹配,其實現過程如下圖所示:看似該算法實現得理所當然,不過對於部分情況其效率相對比較低下,看看如下情況:
  • Go 實現 LeetCode 全集
    Water - https://leetcode.com/problems/container-with-most-water/Binary[X] Sum of Two Integers - https://leetcode.com/problems/sum-of-two-integers/[X] Number of 1 Bits - https://leetcode.com
  • 常用C庫函數的實現
    實現C語言庫函數我們在課上也經常會給大家寫,但是都不夠全面。所以今天就給大家總結了一下。常見C庫函數的實現代碼奉上= '\0')    {        length++; } return length;}06strstrchar *strstr(const char *haystack
  • LeetCode 攻略 - 2019 年 7 月下半月匯總(100 題攻略)
    ) ✔020 - 有效的括號(valid-parentheses) ✔021 - 合併兩個有序鍊表(merge-two-sorted-lists) ✔026 - 刪除排序數組中的重複項(remove-duplicates-from-sorted-array) ✔027 - 移除元素(remove-element) ✔028 - 實現
  • leetcode刷對了麼
    今天,逆行君就帶你從世界觀和方法論兩方面走進「leetcode」 leetcode之世界觀 什麼是leetcode 簡單來說,leetcode是一個美國的在線編程網站,它收集了各大公司的經典算法面試題,用戶可以選擇不同的語言進行代碼的在線編寫、編譯和調試。