c语言实现的带通配符匹配算法

yizhihongxing

带通配符匹配算法

带通配符匹配算法是一种字符串匹配算法,可以匹配包含通配符的字符串。通配符可以代表任何字符或者一组字符。例如,字符串“a*b”可以匹配“ab”、“acb”、“adfb”等字符串。本文将详细介绍如何使用C语言实现带通配符匹配算法。

实现步骤

  1. 我们首先需要确定通配符的类型。一般情况下,通配符分为两种类型:“” 和 “?” 。其中,“” 可以匹配任意数量、任意类型的字符,“?” 可以匹配任意一个字符。

  2. 接着,我们需要遍历匹配字符串和模式串,逐个比较字符。当遇到通配符时,我们需要特殊处理。具体操作如下:

  3. 如果遇到了 “*” ,我们记录下此时匹配字符串和模式串的指针位置,并继续遍历模式串,同时记录答案。

  4. 如果遇到了 “?” ,则该位置可以匹配任意一个字符,直接跳过即可。

  5. 如果当前字符相同,或者模式串中遇到了 “?” ,则继续遍历下一个字符。如果匹配失败,则回溯到最近一次 “*” 的位置,并重复上述操作。

  6. 最后,如果匹配成功,则返回匹配字符串的起始位置,以及模式串中记录的偏移量。

代码实现如下:

#include <stdio.h>
#include <string.h>

int match(char const* s, char const* p)
{
    char const* star = NULL;
    char const* ss = s;

    while (*s)
    {
        if (*p == '?' || *p == *s)
        {
            ++p;
            ++s;
            continue;
        }
        if (*p == '*')
        {
            star = p++;
            ss = s;
            continue;
        }

        if (star)
        {
            p = star + 1;
            s = ++ss;
            continue;
        }

        return 0;
    }

    while (*p == '*')
    {
        ++p;
    }

    return !*p;
}

int main()
{
    char const* s = "hello world";
    char const* p = "?e*?ld";
    int res = match(s, p);
    if (res)
    {
        printf("Match success at position %d, pattern offset %d.\n", res - s, res - p);
    }
    else
    {
        printf("Match failed.\n");
    }
    return 0;
}

示例说明

示例一

匹配 “hello world” 和 “?e*?ld”

  • 匹配 “h” 和 “?” :匹配成功
  • 匹配 “e” 和 “e” :匹配成功
  • 匹配 “l” 和 “*” :记录下匹配位置,匹配失败
  • 匹配 “l” 和 “*” :记录下匹配位置,匹配失败
  • 匹配 “o” 和 “?” :匹配成功
  • 匹配 “w” 和 “w” :匹配成功
  • 匹配 “o” 和 “o” :匹配成功
  • 匹配 “r” 和 “r” :匹配成功
  • 匹配 “l” 和 “l” :匹配成功
  • 匹配 “d” 和 “d” :匹配成功

匹配成功,起始位置为0,偏移量为0。

示例二

匹配 “picture.wav” 和 “*wav”

  • 匹配 “p” 和 “*” :记录下匹配位置,匹配失败
  • 匹配 “p” 和 “*” :记录下匹配位置,匹配失败
  • 匹配 “p” 和 “*” :记录下匹配位置,匹配失败
  • 匹配 “p” 和 “*” :记录下匹配位置,匹配失败
  • 匹配 “i” 和 “*” :记录下匹配位置,匹配失败
  • 匹配 “c” 和 “*” :记录下匹配位置,匹配失败
  • 匹配 “t” 和 “*” :记录下匹配位置,匹配失败
  • 匹配 “u” 和 “*” :记录下匹配位置,匹配失败
  • 匹配 “r” 和 “*” :记录下匹配位置,匹配失败
  • 匹配 “e” 和 “*” :记录下匹配位置,匹配失败
  • 匹配 “.” 和 “*” :记录下匹配位置,匹配成功
  • 匹配 “w” 和 “w” :匹配成功
  • 匹配 “a” 和 “a” :匹配成功
  • 匹配 “v” 和 “v” :匹配成功

匹配成功,起始位置为0,偏移量为0。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c语言实现的带通配符匹配算法 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • 如何利用Emacs来调试C++程序

    如何利用 Emacs 来调试 C++ 程序 第一步:在 C++ 文件中设置断点 在你的 C++ 程序中设置断点,使程序在运行到此处时暂停。你可以在需要设置断点的行前加入以下代码: int main() { int a = 1; int b = 2; int c = a + b; // 在此处设置断点 return c; } 第二步:在 Emacs 中开始调试…

    C 2023年5月30日
    00
  • Linux网络编程之UDP Socket程序示例

    下面是关于使用UDP Socket进行Linux网络编程的攻略及示例. UDP Socket编程简介 UDP全称User Datagram Protocol,是一种无连接的,不可靠的面向数据报的传输协议,采用UDP传输需要自行保证数据的可靠性和完整性。因为UDP通信无连接,所以它发送的数据报文既不需要建立连接,也不需要断开连接,数据报文也不需要发送端和接收端…

    C 2023年5月30日
    00
  • C++ tuple元组的基本用法(总结)

    C++ tuple元组的基本用法(总结) 什么是tuple tuple是C++11标准引入的一个新数据结构,是一个固定大小且支持混合类型的序列。 tuple的定义 我们使用std::tuple<Types…>语法来定义一个tuple变量,其中Types是其元素的类型列表。 #include <tuple> std::tuple&l…

    C 2023年5月23日
    00
  • 全解史上最快的JOSN解析库alibaba Fastjson

    快速解析JSON数据是现代程序设计中非常常见的操作之一。阿里巴巴提供的Fastjson是一种高度优化的开源JSON解析库,可实现快速的JSON序列化和反序列化。 Fastjson的使用步骤 下载并导入Fastjson包。 创建JSON对象 JSONObject object = new JSONObject(); object.put(“name”, “Jo…

    C 2023年5月23日
    00
  • C语言深入探究斐波那契数列

    C语言深入探究斐波那契数列 什么是斐波那契数列? 斐波那契数列,也称黄金分割数列,通俗地说就是以下数列: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, … 在数学上,斐波那契数列的递推公式为:f(n)=f(n-1)+f(n-2),其中f(0)=0,f(1)=1。可以使用递归或循环方式来实现它。 用C语言实现斐…

    C 2023年5月22日
    00
  • C语言实现分治法实例

    C语言实现分治法实例 分治法(Divide and Conquer)是一种处理问题的思想,它的基本思路是:将一个复杂的问题分成两个或更多的子问题,对每一个子问题进行解决,然后将子问题的解合并得到原问题的解。 在C语言中,实现分治法可以通过使用递归函数来实现。 分治法基本思路 分治法基本思路如下: 分解(Divide): 将问题划分成一些子问题,子问题的形式与…

    C 2023年5月23日
    00
  • c++如何实现Base64算法

    C++如何实现Base64算法 Base64简介 Base64是一种将二进制数据编码成ASCII字符的方法,常用于在HTTP协议等网络协议中将二进制数据进行传输。 Base64将三个8位的字节转换为四个6位的字节,产生出来的输出结果最后可能会出现1~2个”=”号,这是为了补齐长度用的。 例如,“Man”这个单词被编码后为“TWFu”,解码后为”Man”。 C…

    C 2023年5月22日
    00
  • C++实现LeetCode(121.买卖股票的最佳时间)

    C++实现LeetCode(121.买卖股票的最佳时间) 题目描述 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。 注意:你不能在买入股票前卖出股票。 示例 1: 输入: [7,1,5,3,6,4] 输出: 5 解释: 在第2天(股票价格 =…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部