第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:View Code#在此之間填寫程式碼 print(Solution().strStr("hello","ll")) print(Solution().strStr("aaaaa", needle = "bba")) print(Solution().strStr(haystack = "", needle = ""))2 解題思路
- 標籤:字串
- 使用滑動視窗,判斷haystack字串中與needle長度相等的視窗是否與needle一樣
#3 解題方法
from typing import List class Solution: def strStr(self, haystack: str, needle: str) -> int: jView Code=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 = ""))第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 步在優化這個可行解,最終找到最優解。左右指標輪流前進,視窗大小增增減減,視窗不斷向右滑動。