首先先上原題:
拿到這道題,我們採取以下的思想來處理這個問題:
1、是否特定的子串在正串中存在?
2、如果不存在,我們應該返回什麼樣的數值?
3、如果存在,我們該怎樣找尋子串在正串中第一次出現的位置?
當我們拿到這道題時,如果能把以下幾道題能夠思考明白,想必這道題的難度係數也不會太大。那我們以此來思考上述的幾個問題,通過完成以上幾個問題的解答來完成對演算法的構造。
1、是否特定的子串在正串中存在?
答:是否可以利用in方法來實現對子串是否存在於正串中進行相應的判定操作。
2、如果不存在,我們應該返回什麼樣的數值?
答:不存在根據題意可知,我們僅需直接返回**-1即可。
3、如果存在,我們該怎樣找尋子串在正串中第一次出現的位置?
答:可以利用列表的切片技術**來實現對子串出現第一出現位置的定位。
由此,基於上面對這三個問題的回答,引出今天的第一種解法。
class
solution
:def
strstr
(self, haystack:
str, needle:
str)
->
int:
# 如果對應的子串長度為0,即空集,那麼空集就是所有元素的子集
iflen
(needle)==0
:return
0# 如果正串為空,那麼久表明元素不存在,則直接返回空值為-1
iflen
(haystack)==0
:return-1
# 判斷子串是否在正串裡:如果沒有,則直接進行返回。
if needle in haystack:
# 查詢對應子串在正串的起始下標,利用切片完成檢索,求出起始位置
for i in
range
(len
(haystack)):
if haystack[i:i+
len(needle)
]== needle:
return i
else
:return
-1
這種方法所涉及在執行器裡面的時間和空間複雜度如下圖所示所以利用的思想:相較於方法1,該方法通過利用子串的長度來縮減正串的檢索長度,並結合切片的思想來完成定址操作。
class
solution
:def
strstr
(self, haystack:
str, needle:
str)
->
int:
# 利用子串的長度來縮短正串的查詢範圍
for i in
range
(len
(haystack)
-m+1):
if haystack[i:i+
len(needle)
]== needle:
return i
這種方法所涉及在執行器裡面的時間和空間複雜度如下圖所示
本題在leetcode上也看到很多種型別的解法,如kmp,sunday,雙指標演算法等。但感覺相對來說所涉及的思路都較為複雜,個人感覺也許殺雞焉用宰牛刀的感覺?當然每個人的見解不一樣,也就導致了對不問題會採用不同型別的處理方法。但是不變的一點是:在使用對應程式語言完成對演算法的編寫的時候,如若能利用到該語言自身所採用的一些tricks來完成對應的演算法解題,那便是再好不過的了,畢竟在實際應用中,演算法是應用被用來進行高效的解決問題。(意見僅為個人觀點,僅供參考)
LeetCode習題總結 演算法(5)
首先先上原題 通過給定對應七種羅馬數字對應的七種字元 i,v,x,l,c,d 和 m 以及對應七種字元所對應的數值 i 1,v 5,x 10,l 50,c 100,d 500,m 1000。去求解在給定乙個羅馬字串時,對應的羅馬數字表示為多少。思路 基於此題目,我們可以發現對應的羅馬字元和羅馬數字之...
LeetCode習題總結 演算法(15)
首先先上原題 在剛看到這道題的時候,也許對於題目的意思能夠進行很好的理解。即本題想要實現的是給定一字串,尋找出最大的無重複子串。但是,我們在面對題目所給樣例如abcabcbb或是pwwekw這樣的包含重複子串的整串時,如果能夠將重複的子串進行適當的刪除操作。這便是本題中最為核心的部分。那麼如果我們需...
六一兒童節之LeetCode習題總結 演算法(14)
首先先上原題 背景闡述 輸入 candies 2,3,5,1,3 extracandies 3 輸出 true,true,true,false,true 解釋 孩子 1 有 2 個糖果,如果他得到所有額外的糖果 3個 那麼他總共有 5 個糖果,他將成為擁有最多糖果的孩子。孩子 2 有 3 個糖果,如...