LeetCode_OJ【10】Regular Expression Matching

本文详细解析了如何实现支持 '.' 和 '*' 的正则表达式匹配算法,通过递归方式处理不同情况,并提供了 C 语言及 Java 实现代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


这道题花了好久才弄清楚题意,a*可以表示任意个a的字符串如:“aa”,"aaa",空串也可以由它表示。

这样.*就可以表示任意位数的任意字符,所以可以表示所有字符。

很多人不理解最后一个例子为什么输出true,这里解释下:首先c*匹配空串,a*匹配“aa”,最后b完全匹配,所以匹配成功。

这个题目可以用动态规划求解,根据p串第二个字符是否为‘*’分为两种情况。

以下分别是该题C和JAVA的实现,c实现起来比较方便,java则要注意数组会不会越界。

C语言:

bool isMatch(char* s, char* p) {
    if(*p == '\0')
        return *s == '\0';
    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);
    }
}

JAVA:

public class Solution {
    public boolean isMatch(String s, String p) {
	if("".equals(p))
			return "".equals(s);
		if(p.length() == 1 || p.charAt(1) != '*'){
			if(!"".equals(s) && ( p.charAt(0) == s.charAt(0) || p.charAt(0) == '.' ) ){
				return isMatch(s.substring(1),p.substring(1));
			}
			return false;
		}
		else{
			while(!"".equals(s) && ( p.charAt(0) == s.charAt(0) || p.charAt(0) == '.' ) ){
				if(isMatch(s, p.substring(2)))
					return true;
				s = s.substring(1);
			}
			return isMatch(s,p.substring(2));
		}
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值