啊哈,演算法 之八 串和kmp演算法

2021-06-17 18:09:47 字數 3160 閱讀 9268

字串大家應該不陌生了!

個人**積累:

先來看看串的結構定義:

#includeusing namespace std;

typedef char type;

#define maxsize 100

typedef struct stringstring;

void strinsert(string *s, int pos, string t)

int i = s->length - 1;

int n = t.length;

for(; i >= pos; --i)

i++;

for(int j = 0; j < n; j++)

s->length = s->length + t.length; }

void initstring(string *s)

void createstring(string *s)

}void strcopy(string *s, string t)

s->length = s->length + t.length;

}void clearstring(string *s)

bool stringempty(string s)

int strlength(string s)

int strcompare(string s, string t)

return 0;

}void strcat(string *s, string s1, string s2)

void substring(string *sub, string s, int pos, int len)

sub->length = len;

}int index(string s, string t, int pos)

string sub;

initstring(&sub);

if(pos > 0) }

return 0;

}int index2(string s, string t, int pos)

else

}if(j >= t)

return i - t + 1;

else

return 0;

}void strdelete(string *s, int pos, int len)

for(int i = pos - 1; i < s->length - len; ++i)

s->length -= len;

}

下面來看kmp演算法:kmp演算法是通過分析子串,預先計算每個位置發生不匹配的時候,所需goto的下乙個比較位置,整理出來乙個next陣列

,然後在上面的演算法中使用。

他的時間複雜 度是o(m+n)  相比樸素比較演算法o((n-m+1)*m)來說當然很快。

本演算法你需要知道如何構建next陣列。  也就是你跟主串比較,子串中有相似項,其比較過後就不必再比較了。

next是什麼?

next陣列是你的串中各個位置   其當前字元之前的串的前字尾的相似度。(此時相似度我們看為j)

如:abcabx;   x之前,字首ab與字尾ab相同,此時他們的取值也就是3。 為何?  看圖:

得出公式:

下面我們來看幾個例子:

看到這裡,我還想說的就是此時的next是有缺陷的,比如我們的主串是 s="aaaabcde"  子串是t="aaaaax「   那麼他的next陣列是 012345,   開始 i=5,j=5  我們發現b和a不等,  此時j=next = 4,  此時b和第四個位置的a也不想等

此時  j=next4 = 3.  直到j=next1 = 0為止,此時i++ j++得到i=6,j=1.

大家有木有發現此時2345步驟是多餘的呢。  由於t的第二三四五位置的字元都與首位的a相等,那麼可以用首位next1的值去取代與它相等的字元後續next的值,我們需要改進:

下面看幾個例子:

下面看**:

void get_nextval(string t, int *next)

else

j = next[j];

} */

//改進演算法

int t = t.length;

int i = 1;

int j = 0;

next[1] = 0;

while ( i < t)

else

j = next[j]; //若字元不同則回 朔 }}

int index_kmp(string s, string t, int pos)

else

}if( j > t )

return i - t + 1;

else

return 0;

}

2013.8.2 

jofranks 於南昌

啊哈演算法之BFS

1 include include struct node int main 初始化地圖 int book 50 50 初始化記錄陣列 int next 4 2 int i,j,k 迴圈中用到的迴圈變數 int startx,starty 起點座標 int p,q 終點座標 int flag 0 表...

啊哈!演算法 之列舉

for i 1 i 9 i 這就是採用列舉的方法,把所有的可能性都進行了嘗試。對於形如這樣的火柴棍,如何在全部使用給定的火柴 m 24 後拼出a b c的等式呢?1.等式中存在固定不變的地方,就是加號與等號,他們一共佔4根。2.a a c這種,只能存在一次。3.a b c與b a c視為不同的兩組。...

字串匹配演算法之KMP演算法和BM演算法

本文主要介紹kmp演算法和bm演算法,它們分別是字首匹配和字尾匹配的經典演算法。所謂字首匹配是指 模式串和母串的比較從左到右,模式串的移動也是從左到右 所謂字尾匹配是指 模式串和母串的的比較從右到左,模式串的移動從左到右。看得出來字首匹配和字尾匹配的區別就僅僅在於比較的順序不同。下文分別從最簡單的字...