LeetCode 44.Wildcard Matching题目解析

description

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

题目复述

实现字符串匹配,需要支持'?'和'*'。

'?':匹配任意单个字符

'*':匹配任何字符序列(包括空字符序列)

题目解析


1.动态规划方法

    看到这个题目最容易想到的方法是回溯法,然而这道题使用回溯法会超时,我们考虑动态规划的方法。

    定义: dp[i][j]表示s[i - s.length()-1]和p[j - p.length()-1]是否匹配。

    考虑边界条件:

        dp[s.length()][p.length()] = 1

        dp[0 - s.length()-1][p.length()] = 0

        dp[s.length()][0 - p.length()]可能为0可能为1(["", "***"]或者["a", "a***"])


    状态转移方程: dp[i][j] = 1当且仅当

         (1)p[j]='*'且dp[k][j+1] = 1, i<=k<=s.length() *匹配任意序列

         (2)p[j]='?'且dp[i+1][j+1] = 1   ?匹配一个字符

         (3)p[j]==s[i]且dp[i+1][j+1] = 1 两个位置字符相等情


class Solution {
public:
    
    bool isMatch(string s, string p) {
        bool dp[1500][1500];
        memset(dp, 0, sizeof(dp));
        
        
        dp[s.length()][p.length()] = 1;
        for(int j=p.length()-1; j>=0; j--)
            for(int i=s.length(); i>=0; i--) {
                if(p[j] == '*') {
                    for(int k=i; k<=s.length(); k++)
                        if(dp[k][j+1] == 1) {
                            dp[i][j] = 1;
                            break;
                        }
                }else if(p[j] == '?') {
                    dp[i][j] = dp[i+1][j+1];
                }else {
                    if(i<s.length() && j<p.length() && s[i] == p[j]) 
                        dp[i][j] = dp[i+1][j+1];
                }
            }
        return dp[0][0];
    }
};

欢迎关注微信公众号 wowAC,提供专业的数据结构以及算法教程附加LeetCode相应题目练习,也提供权威的LeetCode题解。

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可 6私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值