• Wildcard Matching


    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

    思路:

    先是递归,不能过大集合;

    循环可以过,但是p == '*'的情况需要特殊处理,用两个指针记录p == '*'时的s和p的位置。

    因为p的*可以代表很多字符,需要确定*代表s中的那些字符

    代码:

    递归版

    class Solution {
    public:
        bool isMatch(const char *s, const char *p) {
            if (*p == '*')
            {
                while (*p == '*')   p++;
                if (*p == '') return true;
                while (*s != '' && !isMatch(s, p))
                    s++;
                return *s != '';
            }
            else if (*p == '' || *s == '')
                return *p == *s;
            else if (*p == '?' || *p == *s)
                return isMatch(++s, ++p);
            else return false;
        }
    };
    

     循环版

    class Solution {
    public:
        bool isMatch(const char *s, const char *p)
        {
            if (!s && !p)
                return true;
    
            const char *ss = NULL;
            const char *sp = NULL;
    
            while (*s)
            {
                if (*s == *p || *p == '?')
                {
                    s++;
                    p++;
                }
                else if (*p == '*')
                {
                    while (*p == '*')
                        p++;
                    if (*p == '')
                        return true;
                    ss = s;
                    sp = p;
                }
                else if ((*p == '' || *p != *s) && sp)
                {
                    s = ++ss;
                    p = sp;
                }
                else return false;
            }
            while (*p)
                if (*p++ != '*')
                    return false;
            return true;
        }
    };
  • 相关阅读:
    阐述:SIP协议是什么
    【SIP协议】学习初学笔记
    【协议学习】SIP基本场景分析
    电话的前世今生
    深入浅出SIP协议
    QVariant类及QVariant与自定义数据类型转换的方法
    Qt中如何根据类名来实例化对象
    模板的全特化与偏特化
    为什么c++中,有时可以用类名直接访问非静态成员函数?
    C++引用详解
  • 原文地址:https://www.cnblogs.com/dollarzhaole/p/3250983.html
Copyright © 2020-2023  润新知