實現 strStr 字串匹配的三種解法

2021-10-08 16:47:56 字數 2063 閱讀 7790

題目描述:

實現 strstr() 函式。

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

示例 1:

輸入: haystack = 「hello」, needle = 「ll」

輸出: 2

示例 2:

輸入: haystack = 「aaaaa」, needle = 「bba」

輸出: -1

題目分析:字串匹配是一道很經典的題目,除了暴力匹配之外,還有比較常見的kmp演算法,另外,還有一種利用hash值的rk演算法,今天,藉著這道題目,我把三種演算法的**都實現一遍

例子

比如 text=cdabbcabbda, pattern=abbd

text 從位置2開始與pattern匹配,當匹配到位置5時,發現未能完全匹配,於是下次text從(位置2的下乙個)位置3開始匹配,同時,下次pattern從0開始匹配。重複這個過程,直到找到pattern的位置,或者指標到了text末尾,即找不到

**:

class

solution

//完全匹配

if(len==n2)

return p-n2;

//未完全匹配,將從文字串這次匹配的下乙個位置開始匹配

p = p-len+1;

}return-1

;}}

解法2:kmp演算法,暴力匹配時,發現有很多重複的比較過程,km演算法就是借助乙個輔助陣列來盡量的減少這些多餘的匹配過程,這個輔助陣列儲存的資料為:當前字元的前面字串的最長公共前字尾長度。每次不匹配,進行下次匹配時,text保持不動,pattern不是從頭開始,而是從當前字元的前面字串的最長公共前字尾長度處開始,

例子

比如 text=cdabcabecabcabda, pattern=abcabd

text 從位置0開始與pattern匹配,與第乙個位置的不同,繼續後移,當匹配完位置abcab時,發現pattern的d與e不匹配,於是下次text保持不動,同時,從輔助陣列next中查詢當前字元d的值,下次pattern從next[d]開始匹配,字元d的前面的字串為abcab,最長的公共前字尾長度為2(ab),因此下次pattern從2位置開始匹配,可以看到,由於前面已經比較過的字串前字尾是相同,因此我們能直接把pattern的字首和text的字尾部分略過了,直接匹配下乙個位置即可。重複這個過程,直到找到pattern的位置,或者指標到了text末尾,即找不到

cd*

*abcabe*

*cabcabda//不匹配

abcabd

cd**abcabe*

*cabcabda//移動到next[d]

abcabd

**:

class

solution

else

}return next;

}public

intkmp

(string s,string p,

int[

] next)

else}if

(j >= p_len)

return i - j;

else

return-1

;}public

intstrstr

(string haystack, string needle)

}

解法3:rabin karp演算法,先生成pattern視窗內子串的雜湊碼,然後再跟pattern字串的雜湊碼做比較,相等就匹配。

**:

class

solution

return hashvalue;

}public

intstrstr

(string haystack, string needle)

return-1

;}}

實現 strStr 函式,長字串裡搜短字串

給定乙個 haystack 字串和乙個 needle 字串,在 haystack 字串中找出 needle 字串出現的第乙個位置 從0開始 如果不存在,則返回 1。輸入 haystack hello needle ll 輸出 2 輸入 haystack aaaaa needle bba 輸出 1思路...

搜尋字串strstr 函式

strstr 函式的原型 include char strstr const char s1,const char s2 strstr 函式從字串s1中搜尋第一次出現字串s2的位置,如果能搜尋到,那麼返回相應位置 指標 如果搜尋不到,那麼返回null 空指標 如果字串s2為空 長度為0 那麼返回字串...

strstr 函式求字串

kmp 串的模式匹配 25分 給定兩個由英文本母組成的字串 string 和 pattern,要求找到 pattern 在 string 中第一次出現的位置,並將此位置後的 string 的子串輸出。如果找不到,則輸出 not found 本題旨在測試各種不同的匹配演算法在各種資料情況下的表現。各組...