考研數據結構之串(3.2)——串的簡單模式匹配(C表示)

概述

對一個串中某子串的定位操作稱爲串的模式匹配,其中待定位的子串稱爲模式串。算法的基本思想:從主串的第一個位置起和模式串的第一個字符開始比較,如果相等,則繼續逐一比較後續字符:否則從主串的第二個字符開始,再重新用上一步的方法與模式串中的字符做比較,以此類推,直到比較完模式串中的所有字符。若匹配成功,則返回模式串在主串中的位置:若匹配不成功,則返回一個可區別於主串所有位置的標記,如“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;
}

運行結果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章