字串大家應該不陌生了!
個人**積累:
先來看看串的結構定義:
#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演算法,它們分別是字首匹配和字尾匹配的經典演算法。所謂字首匹配是指 模式串和母串的比較從左到右,模式串的移動也是從左到右 所謂字尾匹配是指 模式串和母串的的比較從右到左,模式串的移動從左到右。看得出來字首匹配和字尾匹配的區別就僅僅在於比較的順序不同。下文分別從最簡單的字...