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绠楁硶瀵逛簬閲嶅閮ㄥ垎姣旇緝澶氱殑妯″紡涓插尮閰嶆晥鏋滄洿濂姐