https://leetcode.com/problems/implement-strstr/ 28)(STRSTRを実装
暴力アルゴリズム:
INT ViolentMatch(チャー *のS、チャー *のP) { int型 SLEN = STRLEN(S); INT PLEN = STRLEN(P)は、 int型 I = 0 ; INT J = 0 ; ながら(私は<SLEN && J < PLEN) { IF(S [I] == P [J]) { // ①成功した文字が一致する場合、現在の(即ち、S [I] == P [J ])、 次いで、i、jは++ ++ I ++は、 J ++ ; } 他 { //②ミスマッチ(すなわち、S [i]は= P [J!もし ])、 I = Iとなるよう- (J - 1。)、J 0 = I = I - Jの+ 1。; J = 0 ; } } // 成功した試合、そうでなければ-1パターン文字列のテキスト文字列内のP戻り位置、 IF(J == PLEN) リターン I - J、 他の リターン - 1 ; }
KMP(クヌース - モリス - プラット)アルゴリズム:
ときはT [i]が!= P [j]のとき
そこT [IJ〜I-1] == P [0〜J-1]
Pは[0〜K-1] == P [JK〜J-1]
必然:T [IK〜I-1] == P [0〜K-1] - > K <Jため
指定されたパターン文字列がある場合:全体のパターン文字列を介して左から右へ「ABCDABD」、次のように、プレフィックスとサフィックステーブルを各部分は、次のとおり
すなわち、最大長テーブル、要素の共通接頭辞と接尾辞の各々に対応する元のサブパターン文字列(以下は「最大長」と呼ぶ)です。
KMPアルゴリズム:より容易に0から明らか= NEXT配列の添字=
クラスソリューション{ パブリック: ボイドGenNext(列P、次INT []){ int型PLEN = p.size()。 次の[0] = 0; int型J = 0; 以下のために(INT I = 1; I <PLEN;){ IF(P [j] == P [I]){ 次の[I] = J + 1。 J ++; I ++; } 他{ IF(J = 0!) J =次の[J-1]。 他{ 次の[I] = 0; I ++; } } } } int型STRSTR(文字列干し草、文字列針){ INT SLEN = haystack.size()。 INT PLEN = needle.size()。 もし(SLEN <PLEN)リターン-1; もし(針== "" ||干し草の山== "")の戻り0; int型I = 0、J = 0; int型の次の[PLEN]。 GenNext(針、次); 一方、(I <SLEN && J <PLEN){ IF(干し草の山[I] ==ニードル[J]){ I ++。 J ++; }他{ IF(J = 0!) J =次の[J-1]。 他に 私が++します; } } もし(J == PLEN)戻りIJ。 -1を返します。 } }。
KMPアルゴリズムリファレンス:https://www.cnblogs.com/ZuoAndFutureGirl/p/9028287.html
より高度な検索アルゴリズム:
BMアルゴリズム日曜日のアルゴリズムhttps://www.cnblogs.com/ZuoAndFutureGirl/p/9028287.html