题解 | #字符串通配符#

字符串通配符

http://www.nowcoder.com/practice/43072d50a6eb44d2a6c816a283b02036

递归:当遇到我做了这一步,然后在看做下一步的情况时,需要考虑用递归。(或者出现多种可能性的时候)

#include<bits/stdc++.h>
using namespace std;

bool match(const char* s,const char* p){

    //base case 两个字符串同时结束,返回true
    if((*p=='\0')&&(*s=='\0')){
        return true;
    }

     //两个字符串中有一个先结束,返回false
    if((*p=='\0')||(*s=='\0')){
        return false;
    }


    if(*p=='?'){

        //?只能匹配数字和字符,如果当前遇到了?,又遇到了其他字符,返回false

        if(!isdigit(*s)&&!isalpha(*s)) return false;

        //遇到到 ? 则算匹配到一个字符,跳过一个位置
        return match(s+1,p+1);
    }else if(*p=='*'){


        //遇到连续多个*号,只有一个管作用(否则超时)
        while(*p=='*'){
            p++;
        }
        p--;
        //遇到*号,匹配0个(str+1,str1不用动),匹配1个(str和str1都往前移动1位),匹配多个(str不用动,str+1)

        return match(s,p+1) || match(s+1,p+1) ||  match(s+1,p);

    }else if(tolower(*p)==tolower(*s)){//大小写不敏感
         //当前两字符相等,则进行下一个字符的匹配
        return match(s+1,p+1);
    }

    return false;//不满足上述三种情况,不匹配

}



int main(){

    string p,s;

    while(cin>>p>>s){

        bool res = match(s.c_str(),p.c_str());

        if(res){
            cout<<"true"<<endl;
        }else{
            cout<<"false"<<endl;
        }
    }




    return 0;
}
大厂笔试题题解 文章被收录于专栏

主要是公司笔试题得一些总结

全部评论
ab**与ab匹配时,输出结果有问题
1 回复 分享
发布于 2022-05-10 16:29
第35行s+1没有考虑到s可能不是数字也不是字母
点赞 回复 分享
发布于 2022-07-17 12:14
感谢,很强
点赞 回复 分享
发布于 2022-08-10 20:56
*1* 1 有bug
点赞 回复 分享
发布于 2022-10-02 14:26 河北

相关推荐

10-25 12:05
已编辑
湖南科技大学 Java
若梦难了:我有你这简历,已经大厂乱杀了
点赞 评论 收藏
分享
18 2 评论
分享
牛客网
牛客企业服务