1. 程式人生 > 其它 >第98期-基礎結構:字串 實現 strStr()

第98期-基礎結構:字串 實現 strStr()

1 問題描述

給你兩個字串haystack 和 needle ,請你在 haystack 字串中找出 needle 字串出現的第一個位置(下標從 0 開始)。如果不存在,則返回 -1 。

示例 1:

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

示例 2:

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

示例 2:

輸入:haystack = "", needle = ""
輸出:0

from typing import List
class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        
#在此之間填寫程式碼 print(Solution().strStr("hello","ll")) print(Solution().strStr("aaaaa", needle = "bba")) print(Solution().strStr(haystack = "", needle = ""))
View Code

2 解題思路

  • 標籤:字串
  • 使用滑動視窗,判斷haystack字串中與needle長度相等的視窗是否與needle一樣

#3 解題方法

from typing import List
class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        j
=0 a,b=len(haystack),len(needle) if b==0:return 0 while j<a: if haystack[j:j+b]==needle: return j j+=1 return -1 print(Solution().strStr("hello","ll")) print(Solution().strStr("aaaaa", needle = "bba")) print(Solution().strStr(haystack = ""
, needle = ""))
View Code

第1-3,13-15行:題目中已經給出的資訊,執行程式碼時要根據這些程式碼進行編輯
第4行:定義變數j=0用於滑動視窗左邊框索引
第5行:定義變數a,b分別存放字串haystack和字串needle的長度
第6行:若needle字串長度等於0,則直接返回0
第7行:當索引j小於字串haystack長度時,執行迴圈
第8行:判斷字串haystack從j到j+b即長度為b的切片是否與needle相等
第9行:若相等,則返回j的值
第10行:若不想等,j值加一併執行下次迴圈
第11行:若直到最後都沒有返回值,則返回-1

程式碼執行結果為:

#演算法講解

這裡用到了基礎技巧:滑動視窗,簡單講解下這個技巧:
什麼是滑動視窗
滑動視窗,顧名思義,就是有一個大小可變的視窗,左右兩端方向一致的向前滑動(右端固定,左端滑動;左端固定,右端滑動)。
可以想象成佇列,一端在push元素,另一端在pop元素,如下所示:

假設有陣列[a b c d e f g h]
一個大小為3的滑動視窗在其上滑動,則有:
[a b c]
  [b c d]
    [c d e]
      [d e f]
        [e f g]
          [f g h]

適用範圍
- 1、一般是字串或者列表
- 2、一般是要求最值(最大長度,最短長度等等)或者子序列
演算法思想
- 1、在序列中使用雙指標中的左右指標技巧,初始化 left = right = 0,把索引閉區間 [left, right] 稱為一個視窗。
- 2、先不斷地增加 right 指標擴大視窗 [left, right],直到視窗中的序列符合要求。
- 3、此時,停止增加 right,轉而不斷增加 left 指標縮小視窗 [left, right],直到視窗中的序列不再符合要求。同時,每次增加 left前,都要更新一輪結果。
- 4、重複第 2 和第 3 步,直到 right 到達序列的盡頭。


思路其實很簡單:第 2 步相當於在尋找一個可行解,然後第 3 步在優化這個可行解,最終找到最優解。左右指標輪流前進,視窗大小增增減減,視窗不斷向右滑動。