From ae6008c3065f1cb886cdb543dec2f9e717c5c87b Mon Sep 17 00:00:00 2001 From: Didnelpsun <2675350965@qq.com> Date: Fri, 23 Apr 2021 23:17:50 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=B8=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Code/Code.vcxproj | 1 + Code/link_string.h | 12 ++++++++ Code/sequence_string.h | 62 ++++++++++++++++++++++++++++++++++++++++ Data-Structrue/string.md | 41 +++++++++++++++++++++++++- 4 files changed, 115 insertions(+), 1 deletion(-) create mode 100644 Code/link_string.h create mode 100644 Code/sequence_string.h diff --git a/Code/Code.vcxproj b/Code/Code.vcxproj index fd762cf..91055f9 100644 --- a/Code/Code.vcxproj +++ b/Code/Code.vcxproj @@ -149,6 +149,7 @@ + diff --git a/Code/link_string.h b/Code/link_string.h new file mode 100644 index 0000000..2394ff9 --- /dev/null +++ b/Code/link_string.h @@ -0,0 +1,12 @@ +#include +#include +#include "head.h" + +// 链串 +typedef struct LinkStringNode { + // 每个结点存储一位数据 + char data; + // 每个结点存储四位数据 + //char data[4]; + struct LinkStringNode* next; +} LinkStringNode, *LinkString; \ No newline at end of file diff --git a/Code/sequence_string.h b/Code/sequence_string.h new file mode 100644 index 0000000..8ce2517 --- /dev/null +++ b/Code/sequence_string.h @@ -0,0 +1,62 @@ +#include +#include +#include "head.h" + +// 静态顺序串 +typedef struct { + char data[MAXSIZE]; + // 串长 + int length; +} StaticSequenceString; + +// 动态顺序串 +typedef struct { + char* data; + int length; +} DynamicSequenceString; + +// 求静态顺序子串 +int SubStaticSequenceString(StaticSequenceString string, StaticSequenceString *substring, int index, int length) { + // 如果子串越界 + if (index + length > string.length) { + printf("StaticSequenceString:子串范围越界!"); + return 1; + } + for (int i = 0; i < length; i++) { + substring->data[i] = string.data[index + i]; + } + substring->length = length; + return 0; +} + +// 对比静态顺序字符串 +int CompareStaticSequenceString(StaticSequenceString string1, StaticSequenceString string2) { + for (int i = 0; i <= string1.length && i <= string2.length; i++) { + if (string1.data[i] != string2.data[i]) { + return string1.data[i] - string2.data[i]; + } + } + // 如果扫描过的所有字符都相同,则长度长的字符串更长 + return string1.length - string2.length; +} + +// 在静态顺序字符串中定位子串 +// 如果主串中存在与子串相同的子串,则返回在主串中第一次出现的位置,否则返回-1 +int LocateStaticSequenceString(StaticSequenceString mainstring, StaticSequenceString substring) { + int i = 0; + // 用于暂存子串 + StaticSequenceString temp; + while (i < mainstring.length - substring.length + 1) { + // 从主串切割下来与子串相同长度的子串 + SubStaticSequenceString(mainstring, &temp, i, substring.length); + // 如果切割下来的子串与子串不相等就后移一位再切割子串 + if (CompareStaticSequenceString(substring, temp) != 0) { + i++; + } + // 否则返回当前的索引 + else { + return i; + } + } + return -1; +} \ No newline at end of file diff --git a/Data-Structrue/string.md b/Data-Structrue/string.md index f39dc51..04bb7cb 100644 --- a/Data-Structrue/string.md +++ b/Data-Structrue/string.md @@ -1,7 +1,46 @@ # 涓 +## 鍩烘湰姒傚康 + + 涓诧細闆朵釜鎴栧涓瓧绗︾粍鎴愮殑鏈夐檺搴忓垪銆 ++ 瀛愪覆锛氫覆涓换鎰忎釜杩炵画鐨勫瓧绗︾粍鎴愮殑瀛愬簭鍒椼 + 绌轰覆锛氶暱搴︿负闆剁殑涓层 -+ 绌虹櫧涓诧細浠呯敱涓涓垨澶氫釜绌烘牸缁勬垚鐨勪覆銆 ++ 绌虹櫧涓诧紙绌烘牸涓诧級锛氫粎鐢变竴涓垨澶氫釜绌烘牸缁勬垚鐨勪覆銆 + 绌轰覆鏄换鎰忎覆鐨勫瓙涓诧紝浠绘剰涓叉槸鍏惰嚜韬殑瀛愪覆銆 +涓茬殑鍩烘湰鎿嶄綔鏄瀛愪覆鐨勬搷浣溿 + +## 椤哄簭涓 + +椤哄簭涓茬殑缁撴瀯瀹氫箟鏂规 + ++ 浣跨敤鍗曠嫭鐨勫彉閲弆ength淇濆瓨涓查暱銆 ++ 浣跨敤data[0]璁板綍涓查暱锛涗娇寰楀瓧绗︿綅搴忎笌鏁扮粍涓嬫爣涓鑷达紱浣嗘槸鐢变簬char绫诲瀷涓涓负涓瀛楄妭澶у皬锛屾墍浠ヨ兘琛ㄧず鐨勬暟瀛楁槸0鍒255锛屽お澶х殑涓叉棤娉曡〃绀恒 ++ 娌℃湁琛ㄧず涓查暱鐨勫彉閲忥紝浣跨敤\0琛ㄧず涓茬粨灏撅紝瀵瑰簲ASCII鐮佺殑0鍙峰瓧绗︺ + +## 閾句覆 + +濡備竴鑸殑閾惧紡瀛樺偍缁撴瀯瀹氫箟涓鏍凤紝瀹氫箟涓涓暟鎹笌鎸囧悜涓嬩竴浣嶇殑鎸囬拡銆 + +浣嗘槸濡傛灉浣犲彧鍦ㄦ瘡涓粨鐐瑰畾涔変簡涓涓瓧鑺傜殑鏁版嵁锛屼絾鏄張鍖呭惈浜嗗洓涓瓧鑺傜殑鎸囬拡锛岄偅涔堝瓨鍌ㄥ埄鐢ㄧ巼浼氬緢浣庛 + +濡傛灉鏄『搴忚〃鏁版嵁绫诲瀷鏄暣鏁扮被鍨嬶紝閭d箞杩欑鍒╃敤鐜囦綆鐨勬儏鍐电‘瀹炴棤鍙浣曪紝浣嗘槸瀵逛簬涓茶岃█锛屽洜涓轰竴涓瓧鑺傚瓨鍌ㄤ竴涓瓧绗︼紝鎵浠ヨ兘涓涓瓧鑺傚瓨涓涓瓧绗︾被鍨嬫暟鎹紝鎵浠ヤ负浜嗘彁鍗囨暟鎹瓨鍌ㄥ埄鐢ㄧ巼锛屽彲浠ユ瘡涓粨鐐瑰瓨绛夊涓瓧绗︺ + +## 妯″紡鍖归厤 + +妯″紡鍖归厤鎸囧湪涓讳覆涓壘鍒颁笌妯″紡涓茬浉鍚岀殑瀛愪覆骞惰繑鍥炲叾鎵鍦ㄤ綅缃 + +### 鏈寸礌妯″紡鍖归厤绠楁硶 + +浠庝富涓层佹ā寮忎覆锛堝瓙涓诧級鐨勭涓涓綅缃紑濮嬫瘮杈冿紙i=0,j=0锛夛紝鑻ョ浉绛夛紝鍒 i锛宩 鍚勮嚜+1锛岀劧鍚庢瘮杈冧笅涓涓瓧绗︺傝嫢涓嶇瓑锛屼富涓叉寚閽堝洖婧埌涓婁竴杞瘮杈冧綅缃殑涓嬩竴涓綅缃紝瀛愪覆鍥炴函鍒0锛屽啀杩涜涓嬩竴娆℃瘮杈冦備护瀛愪覆闀垮害涓簃锛屼富涓查暱搴︿负n锛 + ++ 鍖归厤鎴愬姛鐨勬渶濂芥椂闂村鏉傚害锛$O(m)$锛氬垰濂界涓涓氨鍖归厤涓婁簡锛屾诲姣旀鏁颁负瀛愪覆闀垮害銆 ++ 鍖归厤澶辫触鐨勬渶濂芥椂闂村鏉傚害锛$O(n-m+1)=O(n-m)=O(n)$锛氬尮閰嶆垚鍔熶箣鍓嶏紝姣忎竴涓笌绗竴涓瓧绗﹂兘鍖归厤澶辫触銆 ++ 鍖归厤澶辫触鐨勬渶鍧忔椂闂村鏉傚害锛$O(nm-m^2+m)= O(nm)$锛氬瓙涓查櫎浜嗘渶鍚庝竴涓涓嶄笂锛屽叾浣欑殑閮借兘瀵逛笂锛屽垯姣忔閬嶅巻瀹屼竴杈瑰悗锛屽張瑕佽蛋鍥炲ご璺紱鐩村埌鍖归厤鎴愬姛/澶辫触涓鍏遍渶瑕佹瘮杈$m*(n-m+1)$娆°俶锛氭瘡娆¢渶瑕佺Щ鍔╩娆★紝i闇瑕佺Щ鍔$n-m+1$娆° + +### KMP绠楁硶 + +KMP绠楁硶鏄鏈寸礌妯″紡鍖归厤绠楁硶鐨勪紭鍖栥 + +涓昏鎬濇兂鏄け閰嶆椂锛屽彧鏈夋ā寮忎覆鎸囬拡鍥炴函锛屼富涓叉寚閽堜笉鍙樸 +