字串匹配KMP演算法初探
先來看基本的串的匹配演算法。
給定一父串和一子串,判斷子串是否匹配父串,匹配則返回父串開始匹配處的座標,不匹配則返回-1.可配合下面的過程圖看程式碼:
#include <stdio.h>
#include <string.h>
int Index(char s[], char t[], int pos)//s存放父串,t放子串。
{
int i,j,slen,tlen;//i,j代表遊標,分別指向父串和子串
i = pos;//父串從pos位置開始
j = 0;
slen = strlen(s);
tlen = strlen(t);
while( i<slen && j<tlen)
{
if( s[i]==t[j] )
{
i++;
j++;
}
else
{
i = i-j+1;//不能寫成i=1是因為pos不一定從0開始
j = 0;
}
}
if( j >= tlen)
return i-tlen;//返回父串匹配子串開始點的下標
else
return -1;//沒有匹配則返回-1
}
int main()
{
char s[]="goodgoogle";
char t[]="google";
int index = Index(s,t,0);
printf("%d\n",index);//應該返回4
return 0;
}
KMP演算法:
參考:http://blog.sina.com.cn/s/blog_67947d740100nwwl.html
#include <stdio.h>
#include <string.h>
void GetNext(char t[],int next[])
{
int i, j, tlen;
tlen = strlen(t);
i = 0;
j = -1;
next[0] = -1;
while(i < tlen)
{
if((j == -1) || (t[i] == t[j]))
{
i++;
j++;
next[i] = j;
}
else
{
j = next[j];
}
}
}
int Index(char s[], char t[], int pos)//s存放父串,t放子串。
{
int next[255];
int i,j,slen,tlen;//i,j代表遊標,分別指向父串和子串
i = pos;//父串從pos位置開始
j = -1;
slen = strlen(s);
tlen = strlen(t);
GetNext(t,next);
while( i<slen && j<tlen)
{
if( j==-1 || s[i]==t[j] )
{
i++;
j++;
}
else
{
j = next[j];
}
}
if( j >= tlen)
return i-tlen;//返回父串匹配子串開始點的下標
else
return -1;//沒有匹配則返回-1
}
int main()
{
int index;
char s[]="goodgoogle";
char t[]="ababaaaba";
index = Index(s,t,0);
printf("%d\n",index);//應該返回4
return 0;
}
相關文章
- KMP字串匹配演算法KMP字串匹配演算法
- 字串匹配演算法:KMP字串匹配演算法KMP
- 【字串匹配】KMP字串匹配KMP
- 字串匹配問題——KMP演算法字串匹配KMP演算法
- 字串匹配之KMP《演算法很美》字串匹配KMP演算法
- 字串匹配基礎下——KMP 演算法字串匹配KMP演算法
- kmp字串匹配,A星尋路演算法KMP字串匹配演算法
- 字串匹配演算法(三)-KMP演算法字串匹配演算法KMP
- 字串匹配-BF演算法和KMP演算法字串匹配演算法KMP
- 匹配字串之——KMP演算法深入理解字串KMP演算法
- 快速字串匹配一: 看毛片演算法(KMP)字串匹配演算法KMP
- 神奇的字串匹配:擴充套件KMP演算法字串匹配套件KMP演算法
- 第五章 字串專題 ---------------- 字串匹配(二)----KMP演算法字串匹配KMP演算法
- KMP字串模式匹配詳解KMP字串模式
- 字串匹配演算法之 BF 和 KMP 講解字串匹配演算法KMP
- KMP字串匹配學習筆記KMP字串匹配筆記
- 圖解KMP字串匹配演算法+程式碼實現圖解KMP字串匹配演算法
- KMP模式匹配演算法KMP模式演算法
- 【leetcode】28. Implement strStr() 字串匹配KMP BMLeetCode字串匹配KMP
- 模式匹配kmp演算法(c++)模式KMP演算法C++
- 【資料結構與演算法】字串匹配(Rabin-Karp 演算法和KMP 演算法)資料結構演算法字串匹配KMP
- 字串演算法--$\mathcal{KMP,Trie}$樹字串演算法KMP
- Python 細聊從暴力(BF)字串匹配演算法到 KMP 演算法之間的精妙變化Python字串匹配演算法KMP
- 字串匹配演算法(一)字串匹配演算法
- LeetCode_0028. 找出字串第一個匹配項的下標,KMP演算法的實現LeetCode字串KMP演算法
- KMP-字串KMP字串
- [譯] Swift 演算法學院 - KMP 字串搜尋演算法Swift演算法KMP字串
- 單模式匹配 KMP 演算法 簡易版學習筆記模式KMP演算法筆記
- 字串匹配演算法【未完待續】字串匹配演算法
- 字串匹配字串匹配
- 【資料結構與演算法】字串匹配資料結構演算法字串匹配
- 藍橋杯演算法提高——字串匹配(Java)演算法字串匹配Java
- 演算法之字串——正規表示式匹配演算法字串
- 字串匹配演算法(二)-BM演算法詳解字串匹配演算法
- 程式碼隨想錄演算法訓練營第9天 | 字串(KMP演算法) 28. 找出字串中第一個匹配項的下標 459.重複的子字串演算法字串KMP
- KMP 演算法KMP演算法
- KMP演算法KMP演算法
- 【演算法】KMP演算法演算法KMP
- 高效字串匹配演算法——BM 演算法詳解(C++)字串匹配演算法C++