LeetCode 面试题 Regular expression matching(正则匹配)

题目如下:

Implement regular expression matching with support for ‘.’ and ‘*’.

‘.’ Matches any single character.
‘*’ Matches zero or more of the preceding element.

The matching should cover the entire input string (not partial).

The function prototype should be:
bool isMatch(const char *s, const char *p)

Some examples:
isMatch(“aa”,”a”) → false
isMatch(“aa”,”aa”) → true
isMatch(“aaa”,”aa”) → false
isMatch(“aa”, “a*”) → true
isMatch(“aa”, “.*”) → true
isMatch(“ab”, “.*”) → true
isMatch(“aab”, “c*a*b”) → true

题目意图很简单,就是实现一个正则表达式匹配的判定函数。 特别要说一下的是 .* 这个格式,因为不是经常用,最开始想错了,以为是先匹配"." 然后 "." 匹配成什么,后面的 * 就扩展什么。

其实核心的思路是一个动态规划

dp[i][j]表示字串 s[i...len(s)], p[j...len(p)] 是否可以匹配。

那么状态转移方程如下:

dp[i][j] = 

c1. p[j+1] != *.   if s[i] == p[j]  dp[i][j] = dp[i+1][j+1] 

                       else dp[i][j] = false

c2 p[j+1] == '*'  (这个情况下,要扩展 *, dp[i][j] 从拓展的情况下,选择一个是真的结果)

                       if( s[i] ==  p[j] || p[j] == '.' && (*s) != 0)  当s[i] 和 p[j] 一样的时候,例如 aba, a*b这个时候,i = 0, j = 0, 自然可以匹配a a

                                                                                如果p[j] == .  因为他可以匹配任何字符,所以和相等关系有基本一样的方式。

                       并且每一步匹配都要递增 i 的值,如果有成立的,则返回true,否则到匹配终了,返回通配符匹配完成后的结果。


代码如下:

#include <stdio.h>


class Solution {
public:
	bool isMatch(const char *s, const char *p) {
		// Start typing your C/C++ solution below
		// DO NOT write int main() function    

		if( 0 == *p) return 0 == *s;

		if(*(p+1) != '*')
		{
			if(*p == *s || (*p) == '.' && (*s) != 0)
			{
				return isMatch(s+1, p+1);
			}
			return false;
		}
		else
		{
			while(*p == *s || ((*p) == '.' && (*s) != 0))
			{
				if(isMatch(s, p + 2))
				{
					return true;
				}
				s++;
			}
			return isMatch(s, p + 2);

		}
		
	}
};




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值