zoukankan      html  css  js  c++  java
  • leetcode 44. 通配符匹配

    1)动态规划法:110ms 30MB

    class Solution {
    public:
        bool isMatch(string s, string p) {
            //动态规划法:
            //dp[0][0]=1,dp[i][j]表示s前i个字符匹配p前j个字符;
            //dp[i][0]=0,p为空不可能匹配s,
            //dp[0][j]=1,当p的前j个都为*时成立,否则为0;
            //dp[i-1][j-1]==1 && s[i]==p[j]||p[j]=='?' ==> dp[i][j]=1
            //dp[i-1][j]==1 ||dp[i][j-1]==1 && p[j]=='*' ==> dp[i][j]=1;
            int ls=s.size(),lp=p.size();
            vector<vector<int>> dp(ls+1,vector(lp+1,0));
            dp[0][0]=1;
            for(int i=1;i<=ls;i++)
                dp[i][0]=0;
            int flag=1;
            for(int j=1;j<=lp;j++){
                if(p[j-1]!='*') flag=0;
                dp[0][j]=flag;
            }
            for(int i=1;i<=ls;i++){
                for(int j=1;j<=lp;j++){
                    if(s[i-1]==p[j-1] || p[j-1]=='?')
                        dp[i][j]=dp[i-1][j-1];
                    else if(p[j-1]=='*')
                        dp[i][j]=dp[i-1][j]||dp[i][j-1];
                }
            }
            return dp[ls][lp];
        }
    };

    2)双指针法:4ms 8MB

    class Solution {
    public:
        bool isMatch(string s, string p) {
            //双指针法
            /*
            1. 判断是否相等或p[j]为?,是则同时递增
            
            2. s[i]!=p[j] 判断p[j]是否为*,如为*,记录当前*位置start,记录*匹配的字符串结尾为match=i,为开区间,不包括match;可知此时i应该保持原值,j自增1;
            
            3. s[i]!=p[j] 且p[j]!=*, 判断是否之前有*(start是否为-1),如果有*,则将*匹配字符串向后延长一位,j指向*之后一位;此处没有j<p.size(),因为在*的情况下是可能会出现j==p.size()但符合要求的情况的,比如“aa”,"*",匹配完第一个字符后i=0,j=1,此时j==p.size()==1,但是依然可以;
            
            4. 以上均不满足则不可能匹配;
            */
            int i=0,j=0,start=-1,match=0;
            while(i<s.size()){
                if( j<p.size() && (s[i]==p[j] || p[j]=='?') ){
                    i++;j++;
                }else if( j<p.size() && p[j]=='*'){
                    start=j;
                    match=i;
                    j++;
                }else if( start!=-1){
                    match+=1;
                    j=start+1;
                    i=match;
                }else{
                    return false;
                }
            }
            while(j<p.size()){
                if(p[j]!='*') return false;
                j++;
            }
            return true;
        }
    };

  • 相关阅读:
    .net core下直接执行SQL语句并生成DataTable
    asp.net core获取HttpContext相关操作
    连接Oracle的几种方式
    数据库(表)的逻辑备份与恢复
    Oracle函数
    Oracle 11g ORA-12514:TNS:监听程序当前无法识别连接描述符中请求的服务
    未在本地计算机上注册"MSDAORA.1"提供程序
    如果在安装32位oracle 客户端组件时的情况下以64位模式运行,将出现问题
    Oracle Client安装与基本配置
    事务
  • 原文地址:https://www.cnblogs.com/joelwang/p/11196212.html
Copyright © 2011-2022 走看看