執行結果
心得收穫
完整**
/**
* 計算next陣列
* next陣列的目標是求得從開始到當前位置的字串相同最大前字尾長度為多少
* 該值的作用是在當前位置的字元匹配失敗時,匹配字串應該從那裡開始繼續匹配,而不用回到開頭
* 時間複雜的(o(m))
*/void
calnextarray
(const string &str,
int*next)
else
//當head不為0時就代表之前的字串最大相同前字尾長度不為0
//即索引[0 ~ (head-1)]的字串(記為a)與索引[(tail-head) ~ (tail-1)]的字串(記為b)相等
//由於a = b,故a的最大字首等於b的最大字尾
//所以此時head直接回退到a最大字首後的第乙個字元處即可,也即此時(head-1)位置處的next值
//以上head回退方式是保證求得的是最大相同前字尾
else
head = next[head -1]
;}}}
/**
* kmp匹配過程
* 每次匹配失敗後無需返回初始位置,而是利用next陣列和已有匹配結果繼續在當前位置匹配
* 時間複雜度(o(n))
*/int
kmp(
const string &search_str,
const string &match_str)
//匹配成功同時到下乙個字元
else
}delete
next;
if(matchindex != matchlen)
return-1
;else
return
(searchindex - matchindex)
;}
/**
* kmp演算法
* 時間複雜度 o(m*n)
* 2019-05-06 by sunhaojie
*/#include
#include
#include
#include
using
namespace
::std;
/** * 計算next陣列
* next陣列的目標是求得從開始到當前位置的字串相同最大前字尾長度為多少
* 該值的作用是在當前位置的字元匹配失敗時,匹配字串應該從那裡開始繼續匹配,而不用回到開頭
* 時間複雜的(o(m))
*/void
calnextarray
(const string &str,
int*next)
else
//當head不為0時就代表之前的字串最大相同前字尾長度不為0
//即索引[0 ~ (head-1)]的字串(記為a)與索引[(tail-head) ~ (tail-1)]的字串(記為b)相等
//由於a = b,故a的最大字首等於b的最大字尾
//所以此時head直接回退到a最大字首後的第乙個字元處即可,也即此時(head-1)位置處的next值
//以上head回退方式是保證求得的是最大相同前字尾
else
head = next[head -1]
;}}}
/** * kmp匹配過程
* 每次匹配失敗後無需返回初始位置,而是利用next陣列和已有匹配結果繼續在當前位置匹配
* 時間複雜度(o(n))
*/int
kmp(
const string &search_str,
const string &match_str)
//匹配成功同時到下乙個字元
else
}delete
next;
if(matchindex != matchlen)
return-1
;else
return
(searchindex - matchindex);}
intmain()
KMP匹配演算法
1.概述 在講解kmp匹配演算法之前,我們不妨來看看我們用暴力法是怎麼完成字串的匹配的.在我們的目標串t 101011011,和模式串p 110中,我們在t中找尋p第一次出現在t中的下標.通過上圖,我們發現我們利用暴力匹配法,在某次失敗後我們只能非常機械的一步一步移動我們的模式串p.所以我們理解了上...
暴力匹配演算法,首尾匹配演算法,KMP演算法
10170330 容易 include include include define error 0 define maxsize 100 using namespace std 串的暴力匹配演算法 brute force 該函式的作用是返回子z串t在s中第position個字元之後的位置 時間複雜...
模式匹配演算法 KMP演算法
一.基本概念 真字首指的是除了本身以外字串全部頭部的組合,真字尾指的是除了本身以外字串全部尾部的組合。二.簡單的模式匹配演算法 按照正常的思維,字串可以進行暴力匹配,如下。int index bf string s,string p else if j p len else return 1 暴力匹...