c語言 有關字串查詢的兩個演算法

2021-10-02 18:39:13 字數 747 閱讀 1868

假設現在有這樣乙個問題:有乙個文字串s,和乙個模式串p,現在要判斷s中是否有和p匹配的子串,並查詢p在s中的位置,怎麼解決呢?這篇文章就為大家介紹了關於這個問題求解的兩種演算法。

一、bf演算法

bf(brute force)演算法是普通的模式匹配演算法,bf演算法的思想就是將目標串s的第乙個字元與模式串p的第乙個字元進行匹配,若相等,則繼續比較s的第二個字元和p的第二個字元;若不相等,則比較s的第二個字元和p的第乙個字元,依次比較下去,直到得出最後的匹配結果。

**實現:

#include

#include

int bfmatch(char* s,char* p)

if(strlen(p)

== j)//字串匹配成功

i = i-j+1;//若沒有匹配成功,i回退到本次匹配的開始位置

}return -1;

}int main(

)

解析:bf匹配步驟如下:

二、kmp演算法

kmp演算法的關鍵是利用匹配失敗後的資訊,儘量減少模式串與主串的匹配次數以達到快速匹配的目的。在匹配成功的自傳中找到兩個最長相等的真子串。具體實現就是實現乙個next()函式,函式本身包含了模式串的區域性匹配資訊。時間複雜度o(m+n)。

具體解析見字串匹配kmp詳解

字串處理的兩個問題

處理字元是c語言中的常見操作,有兩個問題需要討論 一是判斷字元處理結束的標誌是空字元還是換行符,二是迴圈處理字元時,迴圈次數是字元陣列的容量大小還是實際輸入字元的個數。舉例 鍵盤輸入一行字元,統計大寫字元的個數。本例可用兩種方法程式設計,第一種方法的 如下 include int main 下面是第...

C語言字串處理有關函式

最近一直在刷oj,發現自己對一些字串的處理顯得太過麻煩了,比如數字轉字串 字串拼接等等。雖然知道c語言有專門的函式可以直接進行呼叫,但我以前用的比較少所以並沒有記住函式名以及如何使用這些函式,在這次刷oj的過程中,終於有機會對其進行學習使用,下面是一些我在刷題過程中所遇到而使用的函式。使用這些函式,...

C語言有關字串處理的函式

1 puts和gets puts將乙個字串輸出到螢幕上。gets從終端輸入乙個字串到字元陣列中。char a welcome to char p linux c program puts a puts p 2 strcpy和strncpy include char strcpy char dest,...