朴素的串模式匹配(C语言实现)【串模式匹配】
生活随笔
收集整理的這篇文章主要介紹了
朴素的串模式匹配(C语言实现)【串模式匹配】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
- 算法思想
- 算法描述
- 算法實現
- 測試結果
- 樸素的模式匹配算法評價
算法思想
從主串 S 的第 pos 個字符起和模式 T 的第一個字符比較之,若相同,則繼續比較后續字符;否則從主串 S 的下一個字符起再重新和模式 T 的字符比較之。
例:S = ‘JINANSHI’,T = ‘NAN’。
算法描述
當采用定長順序存儲結構時,實現此操作的算法如下:
int Index(SString S, SString T, int pos) { i = pos; j = 1;while (i <= S[0] && j <= T[0]) {if (S[i] == T[j]) { ++ i; ++ j; } // 繼續比較后繼字符else {i = i – j + 2; j = 1; } // 指針后退重新開始匹配 }if ( j >T[0]) return i -T[0];else return 0; } // Index算法實現
#include <stdio.h> #include <stdlib.h>#define MAXSTRLEN 255//存儲結構 typedef unsigned char SString[MAXSTRLEN + 1]; //基于該存儲結構實現樸素的模式匹配 int Index(SString S, SString T, int pos) {int i = pos; int j = 1;while (i <= S[0] && j <= T[0]){if (S[i] == T[j]){++i;++j;} // 繼續比較后繼字符else{i = i - j + 2;j = 1;} // 指針后退重新開始匹配 }if (j > T[0])return i - T[0];elsereturn 0; }bool StrAssign(SString str, char* src) {char * c = src;int i = 0;for (; *c != '\0'; ++i, ++c){if (0 == i)str[0] = 0;else{str[0] = 0;for (int j = 1; j <= i; j++){str[j] = src[j - 1];str[0] += 1;}}}return true; }int main() {SString s;SString t;char x[] = "abcdefg";char y[] = "fg";StrAssign(s, x);StrAssign(t, y);int pos = Index(s, t, 3);if (pos != 0)printf("模式匹配成功,找到位置為%d\n", pos);elseprintf("模式匹配失敗");return 0; }測試結果
樸素的模式匹配算法評價
設計思想簡單、易于理解。
通常情況下,效率比較高。經常被程序員選用。
此時算法的時間復雜度為:O(n+m)
m、n分別為主串和子串的長度。
某些特殊的情況下,效率比較低。
此時算法的時間復雜度為:O(n*m)
m、n分別為主串和子串的長度。
總結
以上是生活随笔為你收集整理的朴素的串模式匹配(C语言实现)【串模式匹配】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实现公司管理系统【C++实战】(53)
- 下一篇: 循环队列的顺序存储和实现(C语言)【循环