演算法 樸素字串匹配

2021-09-08 22:22:51 字數 1887 閱讀 7087

模式匹配是資料結構中字串的一種基本運算,給定乙個子串,要求在某個字串中找出與該子串相同的所有子串,這就是模式匹配

假設p是給定的子串,t是待查詢的字串,要求從t中找出與p相同的所有子串,這個問題成為模式匹配問題。p稱為模式,t稱為目標。如果t中存在乙個或多個模式為p的子串,就給出該子串在t中的位置,稱為匹配成功;否則匹配失敗。

bf演算法的演算法思想是:

目標串t的的第乙個字元起與模式串p的第乙個字元比較。

若相等,則繼續對字元進行後續的比較;否則目標串從第二個字元起與模式串的第乙個字元重新比較。

直至模式串中的每個字元依次和目標串中的乙個連續的字串行相等為止,此時稱為匹配成功,否則匹配失敗。

一般這種演算法的實現中, 總是會出現四個元素, 模式串, 目標串, 模式串的比較下標 i, 目標串的比較下標 j

再加上返回值下標 ,

演算法**現的元素太多, 不易理解。

下面c版本, 按照功能拆分演算法為兩個函式,

1、演算法介面對應的函式為主函式, 負責每次比較的目標串的起始位置控制,

2、 另外乙個函式, 負責比較功能, 計算模式串是否為 另一字串的頭部, 此函式為主函式呼叫。

實現精神指導: 功能拆分,編碼層面的分治策略, 以更好控制**複雜度(例如巢狀、 迴圈、 元素數目、 以及語義性), 便於讀者理解, 便於提供高質量的**。

#include #include 

#include

#include

#include

#include

typedef

enum

returntype e_return_type;

typedef

enum

booltype e_bool_type;

/*------------------------------ common function ---------------------------------

*///

myprintf == puts + format args

void myprintf(char*fmt, ...)

e_bool_type string_is_head_of_string(

char* headstr, char* string

) pheadstr =headstr;

pstring = string

;

while

( true )

//string is over firstly, return false

if ( chstring == 0

)

//headstr is not a head of string

if ( chhead !=chstring )

pheadstr++;

pstring++;

}}int *****_matcher(char* string, char*substr)

sublen =strlen(substr);

stringlen = strlen(string

); maxpos = stringlen - sublen + 1

;

while ( index index++;

}return -1;}

int main(void

)

else

return0;

}

樸素字串匹配演算法

include include include define maxsize 40 define ok 1 define error 0 using namespace std typedef char string maxsize 1 int string assign string m,char...

樸素的字串匹配演算法

乙個字串是乙個定義在有限字母表 上的字串行。例如,abcdabc是字母表 上的乙個字串。字串匹配問題就是在乙個大的字串t中搜尋某個字串p的所有出現位置。其中,t稱為文字 或稱主串,模式串 p稱為模式 或稱子串 t和p都定義在同乙個字母表 上。設文字為長度為n,用字元陣列t 1.n 表示,模式串長度為...

樸素字串匹配與Karbin Karp演算法

字串的精度匹配就是在文字t中找出模式p的精確副本,並求出匹配的位置下標。即如果p 0.m 1 t k.k m 1 則稱p與t的子串行匹配成功。我們要找出所有匹配成功的k。樸素字串匹配方法很簡單。從文字t的第乙個字母和模式p的第乙個字母開始比較。如果不匹配,就從t的第二個字母開始匹配,依次類推,不保留...