【牛客】 [编程题]字符串通配符C++

1.题目描述

链接https://www.nowcoder.com/questionTerminal/43072d50a6eb44d2a6c816a283b02036

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

2.思路解析

  1. 写一个判断函数,判断s1,s2是不是匹配
  2. 四种情况:两个字符串的字符都匹配
  3. 遇到 ?,就直接让i++,j++
  4. 遇到 * ,flag = false,并且让i++(i走到下一个字符的位置)
  5. 让s2开始遍历,找到和s1匹配的字符,然后继续循环
  6. 否则就直接放回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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43967449/article/details/106885178