資料結構筆記 串

2022-10-09 11:39:07 字數 2248 閱讀 7035

好好學習,天天向上本文已收錄至我的github倉庫daydayup

串(string)是由零個或多個字元組成的有限序列。

#include using namespace std;

#define maxlen 255

typedef struct sstring;

//求子串。用sub返回串s的第pos個字元起長度為len的子串

bool substring(sstring &sub, sstring s, int pos, int len)

for (int i = 0; i < len; i++)

sub.length = len;

return true;

}//比較操作。若s>t,則返回值》0;若s=t,則返回值=0;若s

該演算法採用的是暴力匹配,依次從主串中挑出子串與模式串進行比較。

#include using namespace std;

#define maxlen 255

typedef struct sstring;

//若主串s中存在與模式串串t值相同的子串,則返回它在主串s中第一次出現的位置;否則返回0

//s:主串,t:模式串

int index(sstring s, sstring t) else

}if (j > t.length)

return 0; //不存在這樣的子串

從主串s中依次劃出與子串 t 中大小相等的串,判斷視窗與子串是否相等,不相等時視窗向右移動一格再判斷,直到找出相應的子串或找不出對應的串為止。

跳出迴圈後,如果tindex的值大於t的長度,說明t中的每個字元都比較完了,則表示已經找到了對應的子串,返回子串的起始下標。反之說明是由於主串中已經沒有可比較的子串而跳出的迴圈,返回0表示找不到對應的子串。

在樸素模式匹配演算法中,每次子串與模式串比較失敗後,指標都回溯到新的子串起始處與模式串起始位置重新開始依次比較。但是通過前一次的比較,子串與模式串中的內容我們是知道的,所以不需要每次都從頭開始重新比較。根據規律可以分析出當模式串的第幾個字元匹配失敗後下一次應該從第幾個字元開始比較

定義乙個next陣列,用來記錄當模式串的第幾個字元匹配失敗後,下乙個應該從模式串的第幾個字元開始繼續往後匹配。每次匹配失敗後通過查詢next陣列就可以知道下次應該從第幾個字元開始重新匹配,而不需要每次都從第乙個字元進行比較,這就是kmp演算法與樸素模式匹配演算法的不同之處。

求next陣列

kmp演算法**實現

#include using namespace std;

#define maxlen 255

typedef struct sstring;

//獲取next陣列

void getnextarray(sstring t, int next) else

}}//若主串s中存在與模式串串t值相同的子串,則返回它在主串s中第一次出現的位置;否則返回0

//s:主串,t:模式串

int index_kmp(sstring s, sstring t, int next) else

}if (j > t.length)

return 0; //不存在這樣的子串

}

本文已收錄至我的github倉庫daydayup:github.com/robodlee/daydayup,歡迎starob

資料結構筆記 串

1.1 串概念 1.2 bf 演算法 1.3 kmp 演算法 kmp 演算法 演算法的核心 next 陣列元素的確定 該演算法與目標串 s 無關,只與匹配串 t 的失配位置的前字尾數量有關 t 9 a b a b a a a b a 下標 0 1 2 3 4 5 6 7 8 9 next 0 1 1...

資料結構筆記6 串

在應用程式中使用最頻繁的型別是字串。字串簡稱串,是一種特殊的線 性表,其特殊性在於串中的資料元素是乙個個的字元。字串在計算機的許多方面應用很廣。如在彙編和高階語言的編譯程式中,源程式和目標程式都是字串 資料。在事務處理程式中,顧客的資訊如姓名 位址等及貨物的名稱 產地和規 格等,都被作為字串來處理。...

資料結構筆記6 串

在應用程式中使用最頻繁的型別是字串。字串簡稱串,是一種特殊的線 性表,其特殊性在於串中的資料元素是乙個個的字元。字串在計算機的許多方面應用很廣。如在彙編和高階語言的編譯程式中,源程式和目標程式都是字串 資料。在事務處理程式中,顧客的資訊如姓名 位址等及貨物的名稱 產地和規 格等,都被作為字串來處理。...