編寫一個程式實現模式串的各種模式匹配
/*
*Copyright (c) 2016, 煙臺大學計算機學院
*All rights reserved.
*檔名稱:main.cpp
*作者:張旺華
*完成日期: 2016 年 7 月 2 日
*版本號:v1.0
*問題描述:編寫一個程式實現模式串的各種模式匹配
*
*/
#include <stdio.h>
#define MaxSize 100 //最多的字元個數
typedef struct
{
char data[MaxSize]; //定義可容納MaxSize個字元的空間
int length; //標記當前實際串長
} SqString;
void StrAssign(SqString &s,char cstr[]) //s為引用型引數
{
int i;
for (i=0; cstr[i]!='\0'; i++)
s.data[i]=cstr[i];
s.length=i;
}
void DispStr(SqString s)
{
int i;
if (s.length>0)
{
for (i=0; i<s.length; i++)
printf("%c",s.data[i]);
printf("\n");
}
}
int Index(SqString s,SqString t) //簡單匹配演算法
{
int i=0,j=0;
while (i<s.length && j<t.length)
{
if (s.data[i]==t.data[j]) //繼續匹配下一個字元
{
i++; //主串和子串依次匹配下一個字元
j++;
}
else //主串、子串指標回溯重新開始下一次匹配
{
i=i-j+1; //主串從下一個位置開始匹配
j=0; //子串從頭開始匹配
}
}
if (j>=t.length)
return(i-t.length); //返回匹配的第一個字元的下標
else
return(-1); //模式匹配不成功
}
void GetNext(SqString t,int next[])
{
int j,k;
j=0;
k=-1;
next[0]=-1;
while(j<t.length-1)
{
if(k==-1||t.data[j]==t.data[k])
{
j++;
k++;
next[j]=k;
}
else
k=next[k];
}
}
int KMPIndex(SqString s,SqString t)
{
int next[MaxSize],i=0,j=0;
GetNext(t,next);
while(i<s.length&&j<t.length)
{
if(j==-1||s.data[i]==t.data[j])
{
i++;
j++;
}
else
j=next[j];
}
if(j>=t.length)
return(i-t.length);
else
return(-1);
}
void GetNextval(SqString t,int nextval[]) //由模式串t求出nextval值
{
int j=0,k=-1;
nextval[0]=-1;
while (j<t.length)
{
if (k==-1 || t.data[j]==t.data[k])
{
j++;
k++;
if (t.data[j]!=t.data[k])
nextval[j]=k;
else
nextval[j]=nextval[k];
}
else
k=nextval[k];
}
}
int KMPIndex1(SqString s,SqString t) //修正的KMP演算法
{
int nextval[MaxSize],i=0,j=0;
GetNextval(t,nextval);
while (i<s.length && j<t.length)
{
if (j==-1 || s.data[i]==t.data[j])
{
i++;
j++;
}
else
j=nextval[j];
}
if (j>=t.length)
return(i-t.length);
else
return(-1);
}
int main()
{
int j;
int next[MaxSize],nextval[MaxSize];
SqString s,t;
StrAssign(s,"abcabcdabcdeabcdefabcdefg");
StrAssign(t,"abcdeabcdefab");
printf("串s:");
DispStr(s);
printf("串t:");
DispStr(t);
printf("簡單匹配演算法:\n");
printf(" t在s中的位置=%d\n",Index(s,t));
GetNext(t,next); //由模式串t求出next值
GetNextval(t,nextval); //由模式串t求出nextval值
printf(" j ");
for (j=0; j<t.length; j++)
printf("%4d",j);
printf("\n");
printf(" t[j] ");
for (j=0; j<t.length; j++)
printf("%4c",t.data[j]);
printf("\n");
printf(" next ");
for (j=0; j<t.length; j++)
printf("%4d",next[j]);
printf("\n");
printf(" nextval");
for (j=0; j<t.length; j++)
printf("%4d",nextval[j]);
printf("\n");
printf("KMP演算法:\n");
printf(" t在s中的位置=%d\n",KMPIndex(s,t));
printf("改進的KMP演算法:\n");
printf(" t在s中的位置=%d\n",KMPIndex1(s,t));
return 0;
}
執行結果:
相關文章
- 單例模式的各種實現單例模式
- 自己實現一個 DFA 串模式識別器(一)模式
- 單例模式的各種實現方式(Java)單例模式Java
- 自己實現一個 DFA 串模式識別器(二)模式
- AC 自動機——多模式串匹配模式
- 設計模式學習(一)單例模式的幾種實現方式設計模式單例
- MarkovJunior: 一種基於模式匹配和約束傳播的概率程式語言模式
- 單例模式(下)---聊一聊單例模式的幾種寫法單例模式
- 單例模式(下) - 聊一聊單例模式的幾種寫法單例模式
- 單例模式(下) – 聊一聊單例模式的幾種寫法單例模式
- 五種編碼模式模式
- 單利模式的兩種最佳實現模式
- java幾種代理模式的實現方式Java模式
- Java設計模式——實現單例模式的七種方式[JZOF]Java設計模式單例
- C#練習,編寫一個擲篩子100次的程式,並列印出各種點數的出現次數。C#
- 設計模式 - 單例模式Singleton的8種寫法設計模式單例
- java編寫生產者/消費者模式的程式。Java模式
- 資料結構篇_程式設計思想板塊_第四章串的模式匹配資料結構程式設計模式
- 聊聊 scala 的模式匹配模式
- Swift中的模式匹配Swift模式
- LVS四種實現模式詳解模式
- 單例模式:5種實現方式單例模式
- 一文搞懂藍芽模組各種工作模式藍芽模組模式
- Java 實現單例模式的 9 種方法Java單例模式
- Python單例模式(Singleton)的N種實現Python單例模式
- JS實現單例模式的多種方案JS單例模式
- 使用 React 和 TypeScript something 編寫乾淨程式碼的10個必知模式ReactTypeScript模式
- 【硬核】23種設計模式娓娓道來,助你優雅的編寫出漂亮程式碼!設計模式
- 單例模式的五種寫法單例模式
- 單例模式的六種寫法單例模式
- 單例模式的七種寫法單例模式
- 一起學Scala 模式匹配模式
- 如何寫出一個好的單例模式單例模式
- Java併發程式設計中的設計模式解析(二)一個單例的七種寫法Java程式設計設計模式單例
- Spark3.0.1各種叢集模式搭建Spark模式
- 實現單例模式的 9 種方法,你知道幾種?單例模式
- 【設計模式】實現執行緒安全單例模式的五種方式設計模式執行緒單例
- Go語言實現的23種設計模式之結構型模式Go設計模式
- 一文看懂合約各種型別的交易系統模式型別模式