Java刷题笔记5:通配符匹配

本文记录了一道关于通配符匹配的Java算法题目,使用动态规划方法解决。题目中'?'匹配任意单个字符,'*'匹配任意字符串。讨论了dp状态转移方程,包括'?'和'*'两种情况的处理,并提到了边界条件的设置。虽然动态规划能解决问题,但文章指出贪心算法可能有更高的效率。
摘要由CSDN通过智能技术生成

通配符匹配

题目描述

给定一个字符串 (s) 和一个字符模式 § ,实现一个支持 ‘?’ 和 ‘*’ 的通配符匹配。

‘?’ 可以匹配任何单个字符。 ‘*’ 可以匹配任意字符串(包括空字符串)。 两个字符串完全匹配才算匹配成功。

示例

来自LeetCode
来自LeetCode
题目链接

动态规划

可以使用dp[i][j]来保存s的前i个字符与p的前j个字符匹配情况。当p取到‘?’或者两个字符串取出来的字符相同时。只需要看dp[i-1][j-1]的情况即可,也就是之前的字符串匹配情况。if(p[j]==s[i] || p[j]=='?') dp[i][j]=dp[i-1][j-1]
若p取出来的是‘*’时,我们需要考虑两种情况,*匹配一个空串时,则当s的前i个字符与p的前j-1个字符匹配成功则认为匹配成功。另一种情况则是*匹配s[i],此时若s的前i-1个字符与p的前j个字符匹配成功则认为匹配成功。即if(p[j]=='*')dp[i][j]=dp[i-1][j] || dp[i][j-1].
注意,当*匹配是s[i]时,dp[i][j]=dp[i-1][j]而不是dp[i-1][j-1]因为匹配一个字符后,*仍然可以继续匹配其他字符或空串,若写成dp[i][j]=dp[i-1][j-1]则意味着抛弃了这个*,它不继续匹配。如s=“abc” ,p=“a*” *匹配c后我们查看“ab”与“a*”的匹配情况,而不是跳过*直接查看“ab”与"a"的匹配情况。
我们还需要注意边界情况,空串与空串是可以匹配成功的,所以dp[0][0]=true.若p取空串,则dp[i][0]=false(i>0).若s为空则只有当p[0:j]为’*'时dp[0][j]=ture 否则为false。

 //dp[i][j]保存s的前i个字符与p的前j个字符匹配情况。
        boolean[][] dp = new boolean[s
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值