摘要:最新更新暴力法復(fù)雜度時(shí)間空間思路本題有很多高級(jí)算法可以在時(shí)間內(nèi)解決問(wèn)題,然而這已經(jīng)超出面試的范疇。本題在面試中出現(xiàn)的作用就是考察基本的編程素養(yǎng),以及邊界條件的考慮。它使用一個(gè)數(shù)組,這個(gè)數(shù)組記錄了模式串自身的前綴和后綴的重復(fù)情況。
Implement strStr() 最新更新:https://yanjia.me/zh/2019/02/...
Implement strStr().暴力法 復(fù)雜度Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.
時(shí)間 O(N^2) 空間 O(1)
思路本題有很多高級(jí)算法可以在O(N)時(shí)間內(nèi)解決問(wèn)題,然而這已經(jīng)超出面試的范疇。本題在面試中出現(xiàn)的作用就是考察基本的編程素養(yǎng),以及邊界條件的考慮。我們用暴力法即可。
代碼public class Solution { public int strStr(String haystack, String needle) { int start = 0; // 如果剩下的字母不夠needle長(zhǎng)度就停止遍歷 while(start <= haystack.length() - needle.length()){ int i1 = start, i2 = 0; while(i2 < needle.length() && haystack.charAt(i1)==needle.charAt(i2)){ i1++; i2++; } if(i2 == needle.length()) return start; start++; } return -1; } }KMP算法 復(fù)雜度
時(shí)間 O(N+M) 空間 O(M)
思路KMP算法是較為高級(jí)的算法。它使用一個(gè)next數(shù)組,這個(gè)數(shù)組記錄了模式串needle自身的前綴和后綴的重復(fù)情況。同樣是雙指針進(jìn)行匹配,當(dāng)失配時(shí)可以根據(jù)這個(gè)數(shù)組找到應(yīng)該將模式串向后位移多少位,避免一些重復(fù)的比較。具體的解法這里有兩篇文章比較好,一篇是詳細(xì)講解KMP算法。
如果看完對(duì)產(chǎn)生next數(shù)組的方法還不太明白,還有一篇是講解next數(shù)組怎么得到的。
代碼public class Solution { public int strStr(String haystack, String needle) { if(needle.length() == 0){ return 0; } int[] next = new int[needle.length()]; // 得到next數(shù)組 getNextArr(next, needle); // i是匹配串haystack的指針,j是模式串needle的指針 int i = 0, j = 0; // 雙指針開(kāi)始匹配 while(i < haystack.length() && j < needle.length()){ // 如果j=-1意味著剛剛失配過(guò),下標(biāo)+1后,下一輪就可以開(kāi)始匹配各自的第一個(gè)了 // 如果指向的字母相同,則下一輪匹配各自的下一個(gè) if(j == -1 || haystack.charAt(i) == needle.charAt(j)){ i++; j++; // 如果失配,則將更新j為next[j] } else { j = next[j]; } } return j == needle.length() ? i - j : -1; } private void getNextArr(int[] next, String needle){ // k是前綴中相同部分的末尾,同時(shí)也是相同部分的長(zhǎng)度,因?yàn)殚L(zhǎng)度等于k-0。 // j是后綴的末尾,即后綴相同部分的末尾 int k = -1, j = 0; next[0] = -1; while(j < needle.length() - 1){ // 如果k=-1,說(shuō)明剛剛失配了,則重新開(kāi)始計(jì)算前綴和后綴相同的長(zhǎng)度 // 如果兩個(gè)字符相等,則在上次前綴和后綴相同的長(zhǎng)度加1就行了 if (k == -1 || needle.charAt(j) == needle.charAt(k)){ k++; j++; next[j] = k; } else { // 否則,前綴長(zhǎng)度縮短為next[k] k = next[k]; } } } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/64476.html
摘要:愛(ài)寫(xiě)作者愛(ài)寫(xiě)實(shí)現(xiàn)函數(shù)。說(shuō)明當(dāng)是空字符串時(shí),我們應(yīng)當(dāng)返回什么值呢這是一個(gè)在面試中很好的問(wèn)題。對(duì)于本題而言,當(dāng)是空字符串時(shí)我們應(yīng)當(dāng)返回。這與語(yǔ)言的以及的定義相符。利用內(nèi)建函數(shù)直接得結(jié)果。如果子字符串為空,返回。 愛(ài)寫(xiě)bug(ID:icodebugs)作者:愛(ài)寫(xiě)bug 實(shí)現(xiàn) strStr() 函數(shù)。 給定一個(gè) haystack 字符串和一個(gè) needle 字符串,在 haystack 字符...
摘要:愛(ài)寫(xiě)作者愛(ài)寫(xiě)實(shí)現(xiàn)函數(shù)。說(shuō)明當(dāng)是空字符串時(shí),我們應(yīng)當(dāng)返回什么值呢這是一個(gè)在面試中很好的問(wèn)題。對(duì)于本題而言,當(dāng)是空字符串時(shí)我們應(yīng)當(dāng)返回。這與語(yǔ)言的以及的定義相符。利用內(nèi)建函數(shù)直接得結(jié)果。如果子字符串為空,返回。 愛(ài)寫(xiě)bug(ID:icodebugs)作者:愛(ài)寫(xiě)bug 實(shí)現(xiàn) strStr() 函數(shù)。 給定一個(gè) haystack 字符串和一個(gè) needle 字符串,在 haystack 字符...
摘要:如果存在,返回子字符串的在長(zhǎng)字符串的起始點(diǎn)的位置。如果不存在,則返回。就是遍歷長(zhǎng)字符串,并通過(guò)比較字符找到是否存在目標(biāo)子字符串。需要注意一下的就是對(duì)特殊情況的判斷,以減少無(wú)謂的時(shí)間消耗。 題目詳情 Implement strStr().Return the index of the first occurrence of needle in haystack, or -1 if nee...
Problem Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack. Note 有substring,為何不用。 Solution public class Solution { public ...
摘要:題目要求在子字符串中尋找目標(biāo)字符串,并返回該字符串第一次出現(xiàn)時(shí)的下標(biāo)在嘗試的寫(xiě)了一提中等難度的題目后,又一次回到簡(jiǎn)單難度的題尋找溫暖思路一在原字符串中中尋找目標(biāo)字符串首字母的下標(biāo),并提取子字符串,若該字符串的開(kāi)頭等于目標(biāo)字符串,則返回該下 題目要求: 在子字符串中尋找目標(biāo)字符串,并返回該字符串第一次出現(xiàn)時(shí)的下標(biāo) 在嘗試的寫(xiě)了一提中等難度的題目后,又一次回到簡(jiǎn)單難度的題尋找溫暖T-T 思...
閱讀 517·2021-10-09 09:44
閱讀 2092·2021-09-02 15:41
閱讀 3555·2019-08-30 15:53
閱讀 1834·2019-08-30 15:44
閱讀 1291·2019-08-30 13:10
閱讀 1197·2019-08-30 11:25
閱讀 1467·2019-08-30 10:51
閱讀 3368·2019-08-30 10:49