leetcode 10. Regular Expression Matching 题解

博客提及LeetCode题目,指出递归过程存在大量重复情况,采用记忆化递归的方法来解决问题,运用Java语言实现,涉及动态规划(DP)相关知识。

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

题目链接

关键点

如果pattern至少有两个字符,且第二个是 ' \* ',那么
		· 第一个匹配,字符串string去头再匹配,
				· 匹配, 返回匹配
				· 不匹配, 把头还回去,返回 pattern去头两个再匹配的结果;
		· 第一个不匹配,返回 pattern去头(头两个)再匹配的结果
如果pattern第二个不是 ' \* '
		· 第一个匹配,两个字符串去头再匹配
		· 第一个不匹配,返回不匹配

注意到递归过程中有大量重复,我们采取记忆化递归

class Solution {

	private char[] a ;
	private char[] b ;
	private int[][] flag ;
	
    private int dp(int ai, int bi) {
		if(ai >= a.length) {
			return bi >= b.length ? 2 : 1;
		}
		if(bi >= b.length) {
			if(ai + 1 < a.length && a[ai+1] == '*') {
				return dp(ai+2, bi);
			}else {
				return 1;
			}
		}
		if(flag[ai][bi] != 0) {
			return flag[ai][bi]; // 2 means match and 1 not.
		}
		boolean match = a[ai] == b[bi] || a[ai] == '.'; 
		if(ai +1 <a.length && a[ai+1] == '*') {
			return flag[ai][bi] =
					((match && dp(ai, bi+1) == 2) || dp(ai+2, bi) == 2) ? 2 : 1;
		}else if(match) {
			return flag[ai][bi] = dp(ai+1, bi+1);
		}
		return flag[ai][bi] = 1;
	}

	
	public boolean isMatch(String s, String p) {
		if(p.isEmpty()) return s.isEmpty();
		boolean flag = s.length() >= 1 && (p.charAt(0) == '.' || s.charAt(0) == p.charAt(0));
		if(p.length() >1 && p.charAt(1) == '*') {
			return isMatch(s, p.substring(2)) || (flag && isMatch(s.substring(1), p));
		}
		return flag ? isMatch(s.substring(1), p.substring(1)) : flag;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值