↓快轉到主要內容
  1. LeetCode/

LeetCode 28: Find the Index of the First Occurrence in a String

·1 分鐘· ·
LeetCode Easy Two-Pointers String String-Matching Z-Algorithm
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: easy 第一次嘗試:2022-05-11

  • 提交紀錄:Accepted ×3 → Runtime Error → Accepted ×2

解題思路
#

在 haystack 的每個起點 i 比對 haystack[i:i + m] == needle(String 模板二),起點只到 n - m。面試時通常先講這個 O(nm) 的作法,有需要再提 KMP 的 O(n + m)。Python 內建的 str.find 找不到回傳 -1,剛好是題目要的;str.index 找不到會丟 ValueError。

我的嘗試
#

之前幾次都是用內建的 in 加 index。2022-10 有一次只寫 haystack.index(needle),找不到時丟 ValueError。

正確解法
#

class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        n, m = len(haystack), len(needle)
        for i in range(n - m + 1):
            if haystack[i:i + m] == needle:
                return i
        return -1

複雜度
#

時間 O(nm),空間 O(m)(切片)。

要特別避免的錯誤
#

  • 起點的範圍是 n - m + 1 個。
  • 用內建函式時,index 找不到會丟例外,要用 find。

面試口說整理
#

我在每個可能的起點比對 needle,第一個對上的就回傳,找不到回傳 -1,時間 O(nm);如果要更快可以用 KMP 先算 needle 的失敗函數,做到 O(n + m)。

相關文章

LeetCode 27: Remove Element
·1 分鐘
LeetCode Easy Array Two-Pointers
LeetCode 27 解題筆記:寫入指標只寫不等於 val 的數,最後回傳寫入的個數
LeetCode 58: Length of Last Word
·1 分鐘
LeetCode Easy String
LeetCode 58 解題筆記:split() 不帶參數會忽略結尾的空白,取最後一個單字的長度
LeetCode 67: Add Binary
·1 分鐘
LeetCode Easy Math String Bit-Manipulation Simulation
LeetCode 67 解題筆記:從兩個字串的尾巴往前逐位相加,進位是 sum // 2,這一位是 sum % 2
LeetCode 26: Remove Duplicates from Sorted Array
·1 分鐘
LeetCode Easy Array Two-Pointers
LeetCode 26 解題筆記:快慢指針原地覆寫,慢指針指向下一個要寫的位置;遇到跟前一個寫入的值不同才寫
LeetCode 14: Longest Common Prefix
·1 分鐘
LeetCode Easy Array String Trie
LeetCode 14 解題筆記:用最短的字串當上限,逐個位置檢查所有字串是否相同,第一個不同的位置就是答案的長度
LeetCode 13: Roman to Integer
·1 分鐘
LeetCode Easy Hash-Table Math String
LeetCode 13 解題筆記:從左到右加每個符號的值,如果它比右邊的符號小就改成減