From 5dc818f9af5661bb15300338e296dfac5ece31b9 Mon Sep 17 00:00:00 2001 From: Didnelpsun <2675350965@qq.com> Date: Sat, 24 Apr 2021 23:45:35 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=B2=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Code/Code.vcxproj | 1 + Code/sequence_string.h | 42 ++++++++++++++++++++++++++++++++++++++++ Data-Structrue/string.md | 20 +++++++++++++++++-- 3 files changed, 61 insertions(+), 2 deletions(-) diff --git a/Code/Code.vcxproj b/Code/Code.vcxproj index 91055f9..67ea9a1 100644 --- a/Code/Code.vcxproj +++ b/Code/Code.vcxproj @@ -148,6 +148,7 @@ + diff --git a/Code/sequence_string.h b/Code/sequence_string.h index 8ce2517..669d341 100644 --- a/Code/sequence_string.h +++ b/Code/sequence_string.h @@ -59,4 +59,46 @@ int LocateStaticSequenceString(StaticSequenceString mainstring, StaticSequenceSt } } return -1; +} + +// 求模式串的next数组 +// 数组0号索引不存值 +int GetNext(StaticSequenceString string, int *next[]) { + int i = 1, j = 0; + next[i] = 0; + while (i < string.length) { + if (j == 0 || string.data[i] == string.data[j]) { + ++i, ++j; + *next[i] = j; + } + else { + if (next[j]) { + // 模式串回溯 + j = *next[j]; + } + } + } + return 0; +} + +// KMP算法 +int KMP(StaticSequenceString string1, StaticSequenceString string2) { + int i = 1, j = 1; + int length = string2.length + 1; + int* next = (int*)malloc(length*sizeof(int)); + GetNext(string2, &next); + while (i <= string1.length && j <= string2.length) { + if (j == 0 || string1.data[i] == string2.data[j]) { + i++, j++; + } + else { + // 模式字符串后移 + j = next[i]; + } + } + if (j > string2.length) { + return i - string2.length; + } + return -1; + free(next); } \ No newline at end of file diff --git a/Data-Structrue/string.md b/Data-Structrue/string.md index 04bb7cb..b183b7e 100644 --- a/Data-Structrue/string.md +++ b/Data-Structrue/string.md @@ -17,6 +17,7 @@ + 浣跨敤鍗曠嫭鐨勫彉閲弆ength淇濆瓨涓查暱銆 + 浣跨敤data[0]璁板綍涓查暱锛涗娇寰楀瓧绗︿綅搴忎笌鏁扮粍涓嬫爣涓鑷达紱浣嗘槸鐢变簬char绫诲瀷涓涓负涓瀛楄妭澶у皬锛屾墍浠ヨ兘琛ㄧず鐨勬暟瀛楁槸0鍒255锛屽お澶х殑涓叉棤娉曡〃绀恒 + 娌℃湁琛ㄧず涓查暱鐨勫彉閲忥紝浣跨敤\0琛ㄧず涓茬粨灏撅紝瀵瑰簲ASCII鐮佺殑0鍙峰瓧绗︺ ++ data[0]绌轰綑锛屼娇鐢ㄥ崟鐙殑鍙橀噺length淇濆瓨涓查暱锛岃繖涓瘮杈冨父鐢ㄣ ## 閾句覆 @@ -32,7 +33,7 @@ ### 鏈寸礌妯″紡鍖归厤绠楁硶 -浠庝富涓层佹ā寮忎覆锛堝瓙涓诧級鐨勭涓涓綅缃紑濮嬫瘮杈冿紙i=0,j=0锛夛紝鑻ョ浉绛夛紝鍒 i锛宩 鍚勮嚜+1锛岀劧鍚庢瘮杈冧笅涓涓瓧绗︺傝嫢涓嶇瓑锛屼富涓叉寚閽堝洖婧埌涓婁竴杞瘮杈冧綅缃殑涓嬩竴涓綅缃紝瀛愪覆鍥炴函鍒0锛屽啀杩涜涓嬩竴娆℃瘮杈冦備护瀛愪覆闀垮害涓簃锛屼富涓查暱搴︿负n锛 +浠庝富涓睺銆佹ā寮忎覆P锛堝瓙涓诧級鐨勭涓涓綅缃紑濮嬫瘮杈冿紙i=0,j=0锛夛紝鑻ョ浉绛夛紝鍒 i锛宩鍚勮嚜+1锛岀劧鍚庢瘮杈冧笅涓涓瓧绗︺傝嫢涓嶇瓑锛屼富涓叉寚閽堝洖婧埌涓婁竴杞瘮杈冧綅缃殑涓嬩竴涓綅缃紝瀛愪覆鍥炴函鍒0锛屽啀杩涜涓嬩竴娆℃瘮杈冦備护瀛愪覆闀垮害涓簃锛屼富涓查暱搴︿负n锛 + 鍖归厤鎴愬姛鐨勬渶濂芥椂闂村鏉傚害锛$O(m)$锛氬垰濂界涓涓氨鍖归厤涓婁簡锛屾诲姣旀鏁颁负瀛愪覆闀垮害銆 + 鍖归厤澶辫触鐨勬渶濂芥椂闂村鏉傚害锛$O(n-m+1)=O(n-m)=O(n)$锛氬尮閰嶆垚鍔熶箣鍓嶏紝姣忎竴涓笌绗竴涓瓧绗﹂兘鍖归厤澶辫触銆 @@ -42,5 +43,20 @@ KMP绠楁硶鏄鏈寸礌妯″紡鍖归厤绠楁硶鐨勪紭鍖栥 -涓昏鎬濇兂鏄け閰嶆椂锛屽彧鏈夋ā寮忎覆鎸囬拡鍥炴函锛屼富涓叉寚閽堜笉鍙樸 +鏈寸礌妯″紡鍖归厤绠楁硶鐨勭己鐐瑰氨鏄綋鏌愪簺瀛愪覆涓庢ā寮忎覆鑳介儴鍒嗗尮閰嶆椂锛屼富涓茬殑鎵弿鎸囬拡i缁忓父鍥炴函锛屼粠鑰屽鑷存椂闂村紑閿銆 + +涓昏鎬濇兂鏄け閰嶆椂锛屽彧鏈夋ā寮忎覆鎸囬拡鍥炴函锛屼富涓叉寚閽堜笉鍙橈紝鎵惧埌澶遍厤鍓嶆ā寮忎覆鐨勬渶闀垮叕鍏卞墠鍚庣紑骞惰烦杞埌鏈澶у叕鍏卞悗缂寮濮嬪尮閰嶏紝涓旀渶澶у叕鍏卞墠鍚庣紑瑕佸皬浜庡乏绔瓙涓查暱搴︺ + ++ 鍓嶇紑锛氬浜庡瓧绗︿覆A锛孊锛孉=B+S锛屼笖S闈炵┖锛屽垯B鏄疉鐨勫墠缂銆 ++ 鍚庣紑锛氬浜庡瓧绗︿覆A锛孊锛孉=S+B锛屼笖S闈炵┖锛屽垯B鏄疉鐨勫悗缂銆 ++ PMT鍊硷細鍓嶇紑闆嗗悎鍜屽悗缂闆嗗悎鐨勪氦闆嗕腑锛屾渶闀垮厓绱犵殑闀垮害銆 ++ 閮ㄥ垎鍖归厤琛細PMT鍊奸泦鍚堬紝瀛楃涓叉墍鏈夊墠鍚庣紑鐨凱MT鍊笺 + +褰撲竴涓綅缃け閰嶆椂锛岄偅涔堝瓙涓插墠闈㈢殑鎵鏈夊瓧绗︿覆閮芥槸閰嶅鐨勶紝鎵浠ュ浜庡瓙涓插墠闈㈢殑閮ㄥ垎閮芥槸宸茬煡鐨勪簡锛岄渶瑕佷粠妯″紡涓茬殑鏈寮濮嬪紑濮嬪姣旓紝鑰屼竴鑸殑妯″紡鍖归厤瑕佷粠涓讳覆鐨勪笅涓涓噸鏂板紑濮嬪尮閰嶏紝浣嗘槸濡傛灉鎴戜滑鎵惧埌浜嗕富涓插綋鍓嶅け閰嶄綅缃殑鍓嶇紑鍜屽悗缂鏈澶ч噸鍚堢殑鍦版柟锛屽嵆鍏叡鍓嶅悗缂锛孭MT鍊硷紝灏变唬琛ㄤ粠杩欓噷寮濮嬪氨鍙互鍖归厤浜嗭紝鍓嶉潰鐨勫湴鏂规病蹇呰鍖归厤锛屽彲浠ョ洿鎺ュ璺冲嚑姝ョЩ鍔ㄥ埌鍏叡鍚庣紑鍘诲紑濮嬮噸鏂板尮閰嶃 + +褰撶j涓瓧绗﹀尮閰嶅け璐ワ紝鐢盤鍓1鍒癹-1涓瓧绗︾粍鎴愮殑涓茶涓篠锛屽垯next[j]=S鐨勬渶闀跨浉绛夊墠鍚庣紑闀垮害+1锛堝嵆鏈澶MT鍊+1锛夈傜壒鍒殑next[1]=0锛屼笖next[2]鑲畾涓1銆 + +浣跨敤KMP绠楁硶鏃堕渶瑕佸厛璁$畻涓嶅悓妯″紡涓睵鐨刵ext鏁扮粍锛屾椂闂村鏉傚害涓$O(m)$锛岀劧鍚庝娇鐢↘MP绠楁硶璁$畻锛屾椂闂村鏉傚害涓$O(n)$锛屼粠鑰屽钩鍧囨椂闂村鏉傚害涓$O(m+n)$銆 + +KMP绠楁硶瀵逛簬閲嶅閮ㄥ垎姣旇緝澶氱殑妯″紡涓插尮閰嶆晥鏋滄洿濂姐