字符串通配符

链接:https://www.nowcoder.com/questionTerminal/43072d50a6eb44d2a6c816a283b02036?f=discussion
来源:牛客网

问题描述:在计算机中,通配符一种特殊语法,广泛应用于文件搜索、数据库、正则表达式等领域。现要求各位实现字符串通配符的算法。
要求:
实现如下2个通配符:
*:匹配0个或以上的字符(字符由英文字母和数字0-9组成,不区分大小写。下同)
?:匹配1个字符

输入:
通配符表达式;
一组字符串。

输出:
返回匹配的结果,正确输出true,错误输出false

方法为牛客网答案,个人觉得很好
1、动态规划法

#include<string>
#include<iostream>
#include<vector>
using namespace std;
int match_string(string m_str,string w_str) //match wildcard 通配符
{
    int m_len = m_str.size();
    int w_len = w_str.size();
    vector<vector<int> > b_dp(w_len+1,vector<int>(m_len+1,0));
    //多加一行一列作为初始初值所用
    b_dp[0][0] = 1;
    for(int i=1;i <=w_len;i++)
    {
        char ch = w_str[i-1];
        设置每次循环的初值,即当星号不出现在首位时,匹配字符串的初值都为false
        b_dp[i][0] = b_dp[i-1][0]&&(ch=='*');
        for(int j=1;j<=m_len;j++)
        {
            char ch2 = m_str[j-1];
            if(ch=='*')
                b_dp[i][j]=b_dp[i-1][j]||b_dp[i][j-1]; //当匹配字符为*号时,状态取决于上面状态和左边状态的值
            else
                b_dp[i][j]=b_dp[i-1][j-1]&&(ch=='?'||ch2==ch);
        }
    }
    return b_dp[w_len][m_len];
     
     
     
}
 
int main()
{
    string str1,str2;
    while(cin >> str1 >> str2)
    {
       int rst =  match_string(str2,str1);
       if(rst==1)
           cout << "true" << endl;
        else
           cout << "false" << endl;
    }
     
}

2、递归法

#include <iostream>
#include <string>
using namespace std;
 
bool match(const char* pattern, const char *str)
{
    if (*pattern == '\0' && *str == '\0')
        return true;
    if (*pattern == '\0' || *str == '\0')
        return false;
 
    if (*pattern == '?')
    {
        return match(pattern + 1, str + 1);
    }
    else if (*pattern == '*')
    {
        // 匹配0个1个或多个
        return match(pattern + 1, str) || match(pattern + 1, str + 1) || match(pattern, str + 1);
    }
    else if (*pattern == *str)
    {
        return match(pattern + 1, str + 1);
    }
 
    return false;
}
int main(void)
{
    string pattern, str;
    while (cin >> pattern >> str)
    {
        bool ret = match(pattern.c_str(), str.c_str());
        if (ret)
            cout << "true" << endl;
        else
            cout << "false" << endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值