日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

朴素的串模式匹配(C语言实现)【串模式匹配】

發布時間:2025/3/20 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 朴素的串模式匹配(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语言实现)【串模式匹配】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。