zoukankan      html  css  js  c++  java
  • #leetcode刷题之路44-通配符匹配

    给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 '?' 和 '*' 的通配符匹配。
    '?' 可以匹配任何单个字符。
    '*' 可以匹配任意字符串(包括空字符串)。
    两个字符串完全匹配才算匹配成功。

    说明:
    s 可能为空,且只包含从 a-z 的小写字母。
    p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。
    示例 1:
    输入:
    s = "aa"
    p = "a"
    输出: false
    解释: "a" 无法匹配 "aa" 整个字符串。
    示例 2:
    输入:
    s = "aa"
    p = "*"
    输出: true
    解释: '*' 可以匹配任意字符串。
    示例 3:
    输入:
    s = "cb"
    p = "?a"
    输出: false
    解释: '?' 可以匹配 'c', 但第二个 'a' 无法匹配 'b'。

    思路1:

    这是我第一反应的做法,就是用两个指针按顺序遍历。因为遇到‘?’时和两个字符相等是一样的操作,所以这道题主要是讨论遇到‘*’时的操作,这时需要加入一些辅助指针。

    所有定义的指针为:ss(指向当前位置或pp遇到‘*’的位置)//// pp(指向一个普通位置或当前最后一个‘*’之后的位置) ////sstar (用于跳过s串中的字符)//// pstar(固定指向当前遇到的最后一个*)

    #include <iostream>
    using namespace std;
    
    bool isMatch(string s, string p) {
        char*ss=(char*)s.data();
        char*pp=(char*)p.data();
        char*sstar= nullptr;
        char*pstar= nullptr;
        while(*ss)
        {
            if(*ss==*pp||*pp=='?')
            {
                ss++;
                pp++;
            }
            else if(*pp=='*')
            {
                pstar=pp++;
                sstar=ss;
            }
            else if(pstar)
            {
                pp=pstar+1;
                ss=++sstar;
            }
            else return false;
        }
        while(*pp == '*') ++pp;
        return !*pp;
    }
    int main() {
        string s="aaaa";
        string p="***a";
        std::cout <<isMatch(s,p) << std::endl;
        return 0;
    }

    思路二:

    动态规划法(https://www.cnblogs.com/daleyzou/p/9535134.html):

    bool isMatch(string s, string p) {
        bool **dp=new bool *[s.length()+1];//s.length()+1个bool*类型的一维指针
        for(int i=0;i<s.length()+1;i++)
        {
            dp[i]=new bool[p.length()+1];
            memset(dp[i],0,(p.length()+1)*sizeof(bool));
        }
        dp[0][0]= true;
        for(int i=0;i<p.length();i++)
        {
            if(dp[0][i]&&p[i]=='*')
                dp[0][i+1]=true;
        }
    
        for (int i = 0; i < s.length(); i++){
            for (int j = 0; j < p.length(); j++){
                if (p[j] == '*'){
                    dp[i + 1][j + 1] = dp[i][j+1] || dp[i+1][j];
                }else if (p[j] == '?' || s[i] == p[j]){
                    dp[i + 1][j + 1] = dp[i][j];
                }
            }
        }
        return dp[s.length()][p.length()];
    }
  • 相关阅读:
    关于prototype学习
    java io 从文件的读取和输入
    java 匿名内部类
    动手做个 AI 机器人,帮我回消息!
    几个高效做事的法则,让你的一天有 25 小时
    爆肝一个月,我做了个免费的面试刷题网
    Log4j 被曝核弹级漏洞,开发者炸锅了!
    几个超火的编程网站,别错过!
    Java 处理表格,真的很爽!
    c++智能指针转化:static_pointer_cast、dynamic_pointer_cast、const_pointer_cast、reinterpret_pointer_cast
  • 原文地址:https://www.cnblogs.com/biat/p/10660406.html
Copyright © 2011-2022 走看看