字符串通配符

字符串通配符

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

采用递归的思路。从前向后依次匹配:
遇到相同字符,都向后移动一个字符;
如果通配符遇到"?",则不需匹配,自动跳过一个字符;
如果通配符遇到"*",则可以匹配任意多个字符,包括0个,此时可以有三种选择:
1.匹配0个,通配符向后移动一个字符,字符串不动;
2.匹配1个,通配符和字符串都向后移动一个字符;
3.匹配多个,通配符不动,字符串向后移动一个字符。
递归的终止条件:通配符或者字符串遇到'\0'。表示同时结束,返回true。

#include <iostream>
#include <string>
using namespace std;
bool match(const char* str,const char* str1)
{ 
    //两种特殊情况下的结束
    //两个字符串同时结束,返回true
    if((*str=='\0') && (*str1=='\0'))
        return true;
    //两个字符串中有一个先结束,返回false
    if((*str=='\0') || (*str1=='\0'))
        return false;

    if(*str=='?')
    {
        //遇到到 ? 则算匹配到一个字符,跳过一个位置
       return match(str+1,str1+1);
    }
    else if(*str=='*')
    {
        //遇到*号,匹配0个(str+1,str1不用动),匹配1个(str和str1都往前移动1位),匹配多个(str不用动,str+1)
        //return match(str+1,str1) || match(str+1,str1+1) || match(str,str1+1);
          return match(str+1,str1) || match(str+1,str1+1) || match(str, str1+1);
    }
    else if(*str==*str1)
    {
        //当前两字符相等,则进行下一个字符的匹配
        return match(str+1,str1+1);
    }
    return false;
}
int main()
{
    string str,str1;
    while(cin>>str>>str1)
    {
        bool ret;
        ret=match(str.c_str(),str1.c_str());
        if(ret)
            cout<<"true"<<endl;
        else 
            cout<<"false"<<endl;
    }
    return 0;
}
全部评论
妙解
1 回复 分享
发布于 2021-06-14 22:54
复杂度高是因为没考虑到有连续多个*的情况,连续多个*和一个*的作用是一样的
5 回复 分享
发布于 2021-08-29 16:44
复杂度太多 ,过不了呀..
3 回复 分享
发布于 2021-07-28 20:54
你没考虑大小写
1 回复 分享
发布于 2021-06-25 11:20
对,11/13组 h*h*ah**ha*h**h***hha hhhhhhhahhaahhahhhhaaahhahhahaaahhahahhhahhhahaaahaah 超时
1 回复 分享
发布于 2021-08-15 14:02
您好,我借用您的思路用python仿写的,发现如果碰到第二个字符串里有非字母数字类字符时会出错,如str=a*?*c、str1=a@c
1 回复 分享
发布于 2022-05-16 15:33
不能完全通过测试用例,有解答办法吗
点赞 回复 分享
发布于 2022-05-28 12:08
在《剑指offer》中有一道比这更难的字符串通配符的题,有二种解法:递归和动态规划。 一般来说:递归运算比动态规更消费性能。
点赞 回复 分享
发布于 2022-10-24 10:26 广东
思路挺好的,但是用JavaScript写出来之后发现,没有考虑到非字母和数字的情况
点赞 回复 分享
发布于 2023-01-31 14:35 湖北
return match(str+1,str1) || match(str+1,str1+1) || match(str, str1+1); 可以改成return match(str+1,str1) || match(str, str1+1); 中间的match(str+1,str1+1)属于重复计算了 另外,*? 不能匹配字母和数字之外的字符,需要考虑; 最后,输入的字符串都统一变成大写或小写;
点赞 回复 分享
发布于 2023-04-14 05:56 广东
超时的话把连在一起的*初始化成只有一个就可以了
点赞 回复 分享
发布于 02-20 10:43 江苏

相关推荐

我已成为0offer的糕手:别惯着,胆子都是练出来的,这里认怂了,那以后被裁应届被拖工资还敢抗争?
点赞 评论 收藏
分享
评论
39
12
分享
牛客网
牛客企业服务