1. 程式人生 > >每日練習5-匹配包括"."和"*"的正則表示式,"."表示任意一個字元,"*"表示其前面的字元可以出現任意次(包括0次)

每日練習5-匹配包括"."和"*"的正則表示式,"."表示任意一個字元,"*"表示其前面的字元可以出現任意次(包括0次)

題目:

        匹配包括"."和"*"的正則表示式,"."表示任意一個字元,"*"表示其前面的字元可以出現任意次(包括0次)。比如,"aaa"與"a.a"和"ab*ac*a"匹配,但是與"aa.a" "ab*a"不匹配。

解決思路:

(1)遞迴實現

(2)從兩字串頭開始遍歷,當前字元相同或是當前有字元為“.”,說明當前字元匹配,就指標後移,繼續判斷;

(3)若遇到“*”號,只要*前有一個字元相同,就可才能夠*號後面繼續比較;

實現程式碼:

#include <stdio.h>
#include <assert.h>

int _StringMate(const char* str, const char* arr)
{
	if (*str == '\0' && *arr == '\0')//結束條件,匹配成功
		return 1;
	if (*str != '\0' && *arr == '\0')//結束條件,匹配失敗
		return 0;
	if (*(arr + 1) == '*')
	{
		if ((*str == *arr) || (*arr == '.' && *str != '\0'))
			return _StringMate(str + 1, arr)\//匹配多次
			|| _StringMate(str, arr + 2)\//匹配0次
			|| _StringMate(str+1, arr+2);//匹配1次
		else
			return _StringMate(str, arr + 2);
	}
	if (*str == *arr || (*arr == '.' && *str != '\0'))//當前字元匹配成功
		return _StringMate(str + 1, arr + 1);
	return 0;
}

int StringMate(const char* str, const char* arr)
{
	if (str == NULL || arr == NULL)
		return 0;
	return _StringMate(str, arr);
}
int main()
{
	char* str = "aaa";
	char* arr1 = "a.a";
	char* arr2 = "ab*ac*a";
	char* arr3 = "aa.a";
	char* arr4 = "ab*a";

	int ret1 = StringMate(str, arr1);
	int ret2 = StringMate(str, arr2);
	int ret3 = StringMate(str, arr3);
	int ret4 = StringMate(str, arr4);
	printf("expected is 1 1 0 0, actual is %d %d %d %d\n", ret1, ret2, ret3, ret4);
	system("pause");
	return 0;
}
        關於這種遞迴實現的方法,我是借鑑的書上的,自己並不能夠完全理解,等完全理解後,會來詳細介紹實現過程的。