strStr
作為刷提筆記第一道題众雷,其實(shí)還是有很多東西值得參考的闻鉴,相對(duì)于其他的題目盈厘,字符串操作類的題目很容易把邊界條件的加減搞錯(cuò)缝其。要注意以下幾點(diǎn):
1. 當(dāng)要以兩個(gè)字符串長(zhǎng)度相減作為結(jié)束點(diǎn)是一定要"source.length() - ?target.length() +1"因?yàn)闇p的結(jié)果是最后一個(gè)字符所在的位置,而不是最后一個(gè)字符后面一位忌栅。
2.當(dāng)輸入等于null時(shí)一定要問清面試官到底要返回值是什么车酣。
這是第一種算法曲稼,第二種是取模算法,第三種是KMP
取模算法的核心思想是sliding window湖员,主要分為以下三個(gè)步驟:
1.loop over 通過公式算出target的密碼模贫悄。
2.loop over整個(gè)string然后每個(gè)字符不斷取模,當(dāng)?shù)竭_(dá)target相同個(gè)數(shù)字符之后比較與target模是否相同娘摔,如果相同的話就再比較字符串字符窄坦。當(dāng)string里比較字符的個(gè)數(shù)超過target的個(gè)數(shù)就扔掉前面的字符的模然后繼續(xù)比較。
這樣做的時(shí)間復(fù)雜度近似于m+n凳寺,因?yàn)楫?dāng)兩個(gè)字符串模相同的情況一般情況下就是兩個(gè)字符串相等的情況(哈希碰撞)
程序:
KMP核心思想就是先找出target字符串中重復(fù)的部分鸭津,然后loop over字符串,當(dāng)比較前面位相同時(shí)肠缨,從重復(fù)的最后一段開始繼續(xù)往后面比較逆趋,這樣的時(shí)間復(fù)雜度是M+N
但是總感覺上面的這種方法2更簡(jiǎn)單易于理解