zoukankan      html  css  js  c++  java
  • 【leetcode】Wildcard Matching(hard) ★ 大神太牛了

    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

    我的思路:不提了,太挫了,写了100多行代码都没搞定,直接看大神10行搞定的代码吧:

    其实主要的问题就在于p中的*究竟代表哪几个字母,大神的代码中用ss记录*代表字母的后面一个位置,star记录p中*的位置。

    先假设*代表0个字符,如果后面发现不成立,再返回来

    设*代表1个字符,............................

    bool isMatch(const char *s, const char *p) {
            const char* star=NULL;
            const char* ss=s;
            while (*s){
                //advancing both pointers when (both characters match) or ('?' found in pattern)
                //note that *p will not advance beyond its length 
                if ((*p=='?')||(*p==*s)){s++;p++;continue;} 
    
                // * found in pattern, track index of *, only advancing pattern pointer 
                if (*p=='*'){star=p++; ss=s;continue;} 
    
                //current characters didn't match, last pattern pointer was *, current pattern pointer is not *
                //only advancing pattern pointer
                if (star){ p = star+1; s=++ss;continue;} 
    
               //current pattern pointer is not star, last patter pointer was not *
               //characters do not match
                return false;
            }
    
           //check for remaining characters in pattern
            while (*p=='*'){p++;}
    
            return !*p;  
        }
  • 相关阅读:
    (Java实现) 洛谷 P1603 斯诺登的密码
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1028 数的计算
    (Java实现) 洛谷 P1028 数的计算
    (Java实现) 洛谷 P1553 数字反转(升级版)
    8.4 确定两个日期之间的月份数或年数
    (Java实现) 洛谷 P1553 数字反转(升级版)
  • 原文地址:https://www.cnblogs.com/dplearning/p/4172888.html
Copyright © 2011-2022 走看看