算法练习(13):Regular Expression Matching

题意:实现一个正则匹配函数,判断输入的正则式和输入的字符串是否匹配,规则如上图

分析与思路:这道题要是没有*,就是个非常容易的题目,但是加了个*,就要特殊处理了,因为*是不限制个数的,所以很容易就想到了循环或者递归来处理这个情况。而我的想法是用递归来实现的,把匹配完的部分都截掉,这样就可以明确了*的位置,也就是下标1的位置,这样就需要判断首字符了。*的处理方法呢,我分为0个和多个两种情况,多个的话,我采取一个个匹配的方法。

代码:

#include<iostream>
#include<string>
using namespace std;
string subString(string fa, int i) {//取子字符串
	return string(fa, i, fa.length() - i);
}

class Solution {
public:
	bool isMatch(string text, string pattern) {
		if (pattern.length() == 0) return text.length() == 0;//匹配模式为空的情况
		bool firstmatch = 0;
		if ((text.length() != 0) && (pattern[0] == text[0] || pattern[0] == '.')) {//判断第一个字符是否匹配
			firstmatch = true;
		}
		else firstmatch = false;
		if (pattern.length() >= 2 && pattern[1] == '*') {//判断有*的情况
			return (isMatch(text, subString(pattern, 2)) || (firstmatch&&isMatch(subString(text, 1), pattern)));
		}//*代表0个的情况和多个的情况
		else {
			return firstmatch&&isMatch(subString(text, 1), subString(pattern, 1));
		}//无*的情况
	}
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值