概述
對一個串中某子串的定位操作稱爲串的模式匹配,其中待定位的子串稱爲模式串。算法的基本思想:從主串的第一個位置起和模式串的第一個字符開始比較,如果相等,則繼續逐一比較後續字符:否則從主串的第二個字符開始,再重新用上一步的方法與模式串中的字符做比較,以此類推,直到比較完模式串中的所有字符。若匹配成功,則返回模式串在主串中的位置:若匹配不成功,則返回一個可區別於主串所有位置的標記,如“0”。
分析
代碼
核心代碼:
/* 簡單模式匹配 */
/* str指的是總字符串;substr指的是要取匹配的子串 */
int index(Str str,Str substr) {
int i=0,j=0;// 串從數組下標0位置開始存儲,因此初值爲0;i表示的主串中的下標起始位置;j表示的模式串中的下標起始位置
while(i<str.length&&j<substr.length) {
if(str.ch[i]==substr.ch[j]) { // 如果當前位置的字符匹配
i++;
j++;// 則匹配下一對字符
} else { // 如果不能配對
i=i-j+1;// i則從主串的下一位置開始,k中記錄了上一次的起始位置
j=0;// 將j重置爲0
}
}
if(j==substr.length) {// 如果匹配成功,由於j++和下標從0開始,最後j的值會變成模式串的長度 (注:以main函數中的例子來說,此時j=5)
return i-j;// 此時起始位置即爲i-j(注:以main函數中的例子來說,此時i=10,j=5,而i-j=10-5即爲模式串在主串中的位置)
} else {
return 0;
}
}
完整代碼:
#include<stdio.h>
#include<stdlib.h>
#define maxSize 20
typedef struct {
char *ch;
int length;
} Str;
/* 打印字符串 */
void printStr(Str str) {
printf("\n");
for(int i=0; i<str.length; i++) {
printf("%c",str.ch[i]);
}
printf("\n");
}
/* 簡單模式匹配 */
/* str指的是總字符串;substr指的是要取匹配的子串 */
int index(Str str,Str substr) {
int i=0,j=0;// 串從數組下標0位置開始存儲,因此初值爲0;i表示的主串中的下標起始位置;j表示的模式串中的下標起始位置
while(i<str.length&&j<substr.length) {
if(str.ch[i]==substr.ch[j]) { // 如果當前位置的字符匹配
i++;
j++;// 則匹配下一對字符
} else { // 如果不能配對
i=i-j+1;// i則從主串的下一位置開始,k中記錄了上一次的起始位置
j=0;// 將j重置爲0
}
}
if(j==substr.length) {// 如果匹配成功,由於j++和下標從0開始,最後j的值會變成模式串的長度 (注:以main函數中的例子來說,此時j=5)
return i-j;// 此時起始位置即爲i-j(注:以main函數中的例子來說,此時i=10,j=5,而i-j=10-5即爲模式串在主串中的位置)
} else {
return 0;
}
}
int main() {
Str str,substr;
str.ch="ABABCABCACBAB";
str.length=13;
substr.ch="ABCAC";
substr.length=5;
int i=index(str,substr);
printf("%d\n",i);
return 0;
}
運行結果: