leetcode 44. Wildcard Matching

本文介绍了一种使用动态规划解决通配符匹配问题的方法,包括对特殊字符'*'和'?'的支持,通过实例展示了如何判断字符串是否符合指定的通配符模式。

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

Implement wildcard pattern matching with support for '?' and '*'.

'?' Matches any single character.
'*' Matches any sequence of characters (including the empty sequence).

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", "*") ? true
isMatch("aa", "a*") ? true
isMatch("ab", "?*") ? true
isMatch("aab", "c*a*b") ? false

实现通配符匹配,有点像之前.*匹配,本来也是用递归做,但是超时


于是改成以前解决背包问题的类似方法,用动态规划dp数组


dp[i][j] 表示p[i]与s[j]的匹配情况,可以分为:

如果p[i]=*,则dp[i][j]=dp[i-1][j-1] || dp[i-1][j] || dp[i][j-1] ; 

如果p[i]=? || p[i]=s[j],则dp[i][j]=dp[i-1][j-1];

最后返回dp[m][n]即可。


其实与递归的公式是一样的,主要是对*处理:T(i,j)=T(i-1,j) || T(i,j-1) || T(i-1,j-1)



public boolean isMatch(String s, String p) {
      if(s==null||p==null)return false;
	 if(p.length()<1&&s.length()<1)return true;
	 if(p.length()<1&&s.length()>0)return false;
	 if(s.length()<1&&p.length()>0&&p.charAt(0)!='*'){
		 return false;
	 }
	 int m=p.length();
	 int n=s.length();
	 boolean dp[][] = new boolean[m+1][n+1];
	 dp[0][0]=true;
	 for(int i=1;i<=m;i++){
		if(p.charAt(i-1)=='*'){
		 		dp[i][0]=dp[i-1][0];
		 		for(int j=1;j<=n;j++){
		 			dp[i][j]=dp[i-1][j-1]||dp[i-1][j]||dp[i][j-1];
				 }
			 }
		else{
			 for(int j=1;j<=n;j++){
				 if(p.charAt(i-1)==s.charAt(j-1)||p.charAt(i-1)=='?'){
					 dp[i][j]=dp[i-1][j-1];
				 }
			 }
		}
	 }
		 
			 return dp[m][n];
		 
	 }










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值