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

带通配符匹配算法

带通配符匹配算法是一种字符串匹配算法,可以匹配包含通配符的字符串。通配符可以代表任何字符或者一组字符。例如,字符串“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日

相关文章

  • C++实现Dijkstra(迪杰斯特拉)算法

    下面我将为你讲解如何使用C++实现Dijkstra(迪杰斯特拉)算法。 Dijkstra算法简介 Dijkstra算法是解决单源最短路径问题的一种贪心算法。Dijkstra算法最初是由荷兰的计算机科学家Edsger W. Dijkstra于1956年提出的。该算法的思路是从起点开始,依次访问每个相邻节点,确定从起点到该节点的最短路径,并将该节点标记为已访问。…

    C 2023年5月22日
    00
  • JS 实现Json查询的方法实例

    JS 实现JSON查询的方法实例 在项目中,我们常常需要通过给定的条件查询数据。如果数据存储在JSON格式的文件中,我们可以使用JS实现JSON查询。下面是JS实现JSON查询的方法实例。 1. 获取JSON数据 首先,我们需要获取JSON数据。这可以是从服务器或本地文件中获取。在本例中,我们将使用本地文件。我们可以使用XMLHttpRequest对象获取J…

    C 2023年5月23日
    00
  • C程序 查找矩阵的法向量和迹向量

    C程序 查找矩阵的法向量和迹向量 使用攻略 功能简介 该C程序实现了查找矩阵的法向量和迹向量的功能。其中,法向量为矩阵每一行的平均值组成的向量,迹向量为矩阵的对角线上元素的和。 环境要求 操作系统:Windows、Linux、MacOS等 编译器:gcc、clang等 使用步骤 安装编译器 如果您的计算机中没有相应的C语言编译器,您需要先安装相应的编译器。其…

    C 2023年5月9日
    00
  • C++11标准库bind函数应用教程

    C++11标准库bind函数应用教程 简介 bind函数是C++ 11标准库中提供的一个重要工具,它可以用来将函数绑定到参数上。bind函数可以将一个函数作为参数,将该函数的某些参数绑定到指定的值上,使得这些参数的值在调用函数时被固定,从而达到重复利用该函数的目的。 语法 template <class F, class… Args> /*返…

    C 2023年5月23日
    00
  • JDK1.8、JDK1.7、JDK1.6区别看这里

    JDK1.6、JDK1.7、JDK1.8区别 Java Development Kit(JDK)是Java编程环境的发行版。JDK包含Java运行环境(JRE)和Java开发工具(JDK)。 JDK版本通常以数字表示(例如JDK1.6、JDK1.7、JDK1.8)。下面是这些版本的主要区别。 JDK1.6(Java 6) JDK1.6提供了许多新功能和改进。…

    C 2023年5月22日
    00
  • Notepad++怎么配置默认语言?notepad设置默认语言为c和Java语言的方法

    下面是Notepad++配置默认语言的攻略: Notepad++配置默认语言 前言 Notepad++是一款常用的文本编辑器,支持多种编程语言的语法高亮,并且不需要安装,方便实用。但是默认情况下,并没有设置默认语言,每次打开一个文件时都需要手动选择语言,这对于程序员来说是一件很麻烦的事情。所以下面我将向大家介绍如何配置Notepad++默认语言的方法。 方法…

    C 2023年5月23日
    00
  • golang生成JSON以及解析JSON

    生成JSON: 在golang中生成JSON非常简单,可以使用标准库中的encoding/json包来实现。下面是一个示例代码: package main import ( "encoding/json" "fmt" ) type Person struct { Name string `json:"name…

    C 2023年5月23日
    00
  • 0到1分析美团端侧cdn容灾解决方案

    0到1分析美团端侧CDN容灾解决方案攻略 背景介绍 在互联网行业,容灾解决方案非常重要。当系统出现故障时,为了保证用户体验,需要用容灾方案来解决和恢复服务。CDN是一种常见的解决方案,可以加速资源访问并分担服务压力。本文将详细介绍美团端侧CDN的容灾解决方案。 容灾解决方案 美团端侧CDN容灾解决方案主要分为以下几个部分: 1. 备用域名解析 美团会为CDN…

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