题目描述
问题描述:在计算机中,通配符一种特殊语法,广泛应用于文件搜索、数据库、正则表达式等领域。现要求各位实现字符串通配符的算法。
要求:
实现如下2个通配符:
*:匹配0个或以上的字符(字符由英文字母和数字0-9组成,不区分大小写。下同)
?:匹配1个字符
输入:
通配符表达式;
一组字符串。
输出:
返回匹配的结果,正确输出true,错误输出false
输入描述:
先输入一个带有通配符的字符串,再输入一个需要匹配的字符串
输出描述:
返回匹配的结果,正确输出true,错误输出false
示例1
输入
te?t*.*
txt12.xls
输出
false
算法实现
#include <iostream>
#include <string>
using namespace std;bool match(std::string& s1, std::string& s2, int s1i, int s2i)
{if (s1i == s1.size() && s2i == s2.size()) // 两边都匹配到最后return true;else if (s1i == s1.size() || s2i == s2.size()) // y一方还有字符return false;if (s1[s1i] == '?' || s1[s1i] == s2[s2i])return match(s1, s2, s1i + 1, s2i + 1); // 相等或者?匹配一个字符else if (s1[s1i] == '*')// 匹配0个 匹配1个 至少匹配1个(相当于*还在,sli不需要+1)return match(s1, s2, s1i + 1, s2i) || match(s1, s2, s1i + 1, s2i + 1) || match(s1, s2, s1i, s2i + 1);return false;
}int main()
{std::string s1, s2;while (std::cin >> s1 >> s2){int s1i = 0, s2i = 0;if (match(s1, s2, s1i, s2i))std::cout << "true" << std::endl;elsestd::cout << "false" << std::endl;}return 0;
}