每日练习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;
}

       

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值