1.题目描述
链接https://www.nowcoder.com/questionTerminal/43072d50a6eb44d2a6c816a283b02036
问题描述:在计算机中,通配符一种特殊语法,广泛应用于文件搜索、数据库、正则表达式等领域。现要求各位实现字符串通配符的算法。
要求:
实现如下2个通配符:
*:匹配0个或以上的字符(字符由英文字母和数字0-9组成,不区分大小写。下同) ?:匹配1个字符
2.思路解析
- 写一个判断函数,判断s1,s2是不是匹配
- 四种情况:两个字符串的字符都匹配
- 遇到 ?,就直接让i++,j++
- 遇到 * ,flag = false,并且让i++(i走到下一个字符的位置)
- 让s2开始遍历,找到和s1匹配的字符,然后继续循环
- 否则就直接放回false
3.代码实现
#include <iostream>
#include <string>
using namespace std;
bool Judge(const string& s1, const string& s2)
{
// i来遍历s1, j来遍历s2
int i = 0;
int j = 0;
// flag处理*
bool flag = false;
while(s1[i] || s2[j])
{
// 如果是同样的字符,就一直往后走
if(s1[i] == s2[j] || s1[i] == '?')
{
i++;
j++;
}
// * 下面处理*
else if(s1[i] == '*')
{
++i;
flag = true;
}
// 找s2相同的字符
else if(flag)
{
while(s1[i] != s2[j])
++j;
flag = false;
}
else
return false;
}
// 如果此时的s1,s2都走到了末尾,则表示匹配成功
if(s1[i] == '\0' && s2[j] == '\0')
return true;
else
return false;
}
int main()
{
string s1;
string s2;
// 因为是一行一行输入,所以用getline
while(getline(cin, s1))
{
getline(cin, s2);
// 调用函数
if(Judge(s1, s2))
cout << "true" << endl;
else
cout << "false" << endl;
}
return 0;
}