32.3-5带有通配符的匹配(自动机)

article/2025/10/1 19:16:44

功能

这个程序可以判断一个带有通配符*的模式串是否在文本串中存在,没有记录位置信息,当然,想记录也是可以的

样例输入:
abccbacbababc
ab*bab*c
样例输出:
1

思路

对于样例输入,有限自动机如图所示:
这里写图片描述
我们把每个通配符隔开的字串看做独立的,在其上运行KMP算法的comput_suffix_function过程,区别仅在于每部分的开头的fail指向上部分的结尾,每个部分的结尾fail指向自己(如果后面紧跟的一位匹配失败,由于通配符可以代替任意长度的任意字符串,不需要像KMP算法一样前移)

#include<stdio.h>
#include<string.h>
#define maxm 1000
typedef struct e{char letter;/*字符(不包括)*/int end;/*如果字符后面是*号,标记end为1*/int fail;/*相当于π函数*/
}e;
typedef struct MAC{int n;/*非*字符的个数*/e p[maxm+1];
}MAC;
MAC initmac(void)
{char p[maxm];scanf("%s",p);int i,l,k=0;l=strlen(p);MAC mac;mac.p[0].end=1;/*特殊情况,置0*/for (i=0;i<l;i++)if (p[i]!='*'){k++;mac.p[k].end=0;mac.p[k].letter=p[i];}elsemac.p[k].end=1;mac.n=k;return mac;
}
int computfail(MAC *mac)/*这里一定要用指针,因为结构作为参数传递时,是复制内存*/
{int q,i;int n=mac->n;e *p=mac->p;q=0;for (i=1;i<=n;i++)if (p[i].end)/*如果后面是*号,fail指向自己*/{p[i].fail=i;q=i;}elseif (p[i-1].end)/*指向前面的最后一个字符,相当于KMP算法中的初始化*/{p[i].fail=i-1;q=i-1;}else/*和KMP算法一样,即对单个字符串计算π函数*/{while ((!p[q].end)&&(p[q+1].letter!=p[i].letter))q=p[q].fail;if (p[q+1].letter==p[i].letter)q++;p[i].fail=q;}return 0;
}
int match(MAC *mac,char t[])/*和KMP算法中的匹配几乎一样*/
{int i,l=strlen(t),q=0;int n=mac->n;e *p=mac->p;for (i=0;i<l;i++){while ((!p[q].end)&&(p[q+1].letter!=t[i]))q=p[q].fail;if (p[q+1].letter==t[i])q++;if (q==n)return 1;/*和书上的KMP匹配的时候不一样,这里直接退出即可,实际上不退出也只能找到前面相同,最后一个部分出现位置不同*/}return 0;
}
int main(void)
{char t[maxm];scanf("%s",t);MAC mac;mac=initmac();computfail(&mac);int ans;ans=match(&mac,t);printf("%d\n",ans);return 0;
}

缺点是只能找到一次出现的位置,要找到所有的位置,目前只知道递归搜索…哎…


http://chatgpt.dhexx.cn/article/k8ZBC6Gy.shtml

相关文章

自己动手写编译器:代码实现正则表达式到NFA状态机

在编译器开发中有两个非常重要的工具名为lex和yacc&#xff0c;他们是编译器的生成器。本质上我们不需要一行行去完成编译器的代码&#xff0c;只需要借助这两个工具&#xff0c;同时制定好词法解析和语法解析的规则后&#xff0c;这两个工具就会自动帮我们把代码生成&#xff…

mac搭建网站服务器,Mac上搭建Web服务器--Apache

局域网搭建 Web 服务器测试环境,因为Mac OS X 自带了 Apache 和 PHP 环境,我们只需要简单的启动它就行了。 1.命令:sudo apachectl start Apache服务器默认的web根目录在:/Library/WebServer/Documents Apache的配置文件在:/etc/apache2 相关命令: 停止 Apache:sudo apac…

aText for Mac(打字加速器)

aText作为一款文字效率的工具&#xff0c;对于文字工作者来说这款软件的目的是为了减少你在文字输入的过程当中的重复性&#xff0c;这款试用版本能够让你体验到一些较为基础的功能。 aText下载安装教程 镜像包下载完成后打开&#xff0c;双击.pkg按照安装引导器进行安装即可&a…

共享文件夹无法打开——服务器存储空间不足,无法处理此命令

原文地址为&#xff1a; 共享文件夹无法打开——服务器存储空间不足&#xff0c;无法处理此命令 共享某个文件夹后在网上邻居打开它&#xff0c;提示&#xff1a;“服务器存储空间不足&#xff0c;无法处理此命令”&#xff0c;如下图&#xff1a; 查看系统日志显示&#xff1…

彻底解决win10 docker desktop镜像过大导致“C盘存储空间不足”的问题。

彻底解决win10 docker desktop镜像过大导致“C盘存储空间不足”的问题。 win10安装docker只需要双击安装包&#xff0c;真正实现了傻瓜式安装&#xff0c;这一点真的十分方便&#xff01;不过用了义端时间docker后&#xff0c;突然有一天我注意到C盘原本充裕的空间容量&#x…

mysql数据库空间不足_mysql空间不足怎么解决?

磁盘空间不足&#xff0c;使用du命令察看 du -h --max-depth1 当前目录下占空间比较大的是104个mysql-bin.00000X 和ibdata1。 mysql数据目录下有大量的mysql-bin.00000X文件&#xff0c;这些文件是做什么的呢&#xff1f; 这是数据库的操作日志&#xff0c;例如UPDATE一个表&a…

ubuntu提示根目录存储空间不足的解决办法

因为每次使用系统都会产生大量的日志文件&#xff0c;如果没有设置自动清理日志文件或者分区较小&#xff0c;日志文件在一段时间的堆积后就会导致存储空间不足&#xff0c;所以需要清除日志文件。以下是清除步骤&#xff1a; 1、切换为超级用户 su2、查看日志文件大小 du &am…

ES存储空间不足导致索引read-only解决

在es存储数据的时候报了这个错&#xff0c;然后网上都说是磁盘不够了&#xff0c;一看果然是磁盘剩余不足5个G了。。。 解决方案 1- 最简单的也就是清理下磁盘空间。 2- 更改elasticsearch.yml配置文件。在配置文件后加上&#xff1a; cluster.routing.allocation.disk.wate…

如何解决IIS配置报错问题:存储空间不足?

如何解决IIS配置报错问题&#xff1a;存储空间不足 存储空间不足&#xff1b;并导致IIS安装失败 服务器说明&#xff1a; 当前服务器为阿里云服务器操作系统&#xff1a;windows services 2008 R2基本配置&#xff1a; 1G内存 20G40G存储盘服务器尚未安装配置IIS **“存储空间…

解决群晖 “由于系统可用存储空间不足,您将无法登录“ 的问题

最近打开群晖提醒 由于系统可用存储空间不足,您将无法登录。经过上网查询终于解决了问题&#xff0c;现记录如下&#xff1a; 问题总结 利用命令定位到哪个文件夹异常过大&#xff0c;删除之即可具体步骤 利用SSH进入群晖管理界面&#xff0c;利用sudo -i 拿到管理权限 利用…

计算机管理 存储空间不足,Win7系统提示“存储空间不足,无法处理此命令”怎么办?...

最近有Win7系统用户反映&#xff0c;打开某些程序的时候&#xff0c;出现提示“存储空间不足&#xff0c;无法处理此命令”&#xff0c;导致程序打开失败&#xff0c;这让用户非常苦恼。那么&#xff0c;Win7系统提示“存储空间不足&#xff0c;无法处理此命令”怎么办呢&#…

32计算机内存不足,Win7 32位提示存储空间不足无法处理此命令

近日&#xff0c;有不少用户反映说在win7 32位系统电脑上玩游戏或者打开程序的时候&#xff0c;遇到了无法运行的错误或者弹出错误信息“存储空间不足无法处理此命令”&#xff0c;导致无法运行游戏或者程序&#xff0c;为什么会出现这样的问题呢&#xff0c;下面就针对这个问题…

远程桌面登录提示存储空间不足

远程桌面登录提示存储空间不足 云服务器windows2012远程桌面登录提示存储空间不足&#xff0c;无法完成此操作&#xff1b;点击确定按钮后回到登录界面&#xff1b; 使用控制台模式登录到服务器后端&#xff0c;查看RDP的登录权限&#xff0c;发现是本地系统账号&#xff1b;…

打开共享文件提示服务器空间不足,访问网络共享报告“服务器存储空间不足,无法处理此命令”...

访问网络共享报告“服务器存储空间不足,无法处理此命令” 万华数据 有些计算机在共享一个文件夹后,从网络上另一台计算机访问这个共享文件夹会出现“服务器存储空间不足,无法处理此命令”错误信息,更奇怪的是有时访问C盘的共享文件夹会出现这个问题,而访问其它盘的共享文件…

局域网访问文件提示服务器内存不足,“服务器存储空间不足”的问题

局域网客户机通过网上邻居访问一台以windows 2003作为文件共享服务器的时候&#xff0c;出现“无法访问&#xff0c;您可能没有权限使用网络资源&#xff0c;请与管理员联系查明权限&#xff0c;服务器存储空间不足&#xff0c;无法处理此命令”的错误提示。 这个时候这台服务器…

计算机管理 存储空间不足,win10系统提示“存储空间不足无法处理此命令”的处理技巧...

win10系统使用久了&#xff0c;好多网友反馈说win10系统提示“存储空间不足无法处理此命令”的问题&#xff0c;非常不方便。有什么办法可以永久解决win10系统提示“存储空间不足无法处理此命令”的问题&#xff0c;面对win10系统提示“存储空间不足无法处理此命令”的图文步骤…

计算机提示存储空间不足怎么办,电脑提示存储空间不足,无法处理此命令是什么原因?怎么解决?...

电脑“存储空间不足 无法处理此命令”怎么办&#xff1f;每次游戏玩着玩着就会弹出这样一个错误提示&#xff0c;那么造成这个情况的原因是什么&#xff1f;下面我们一起来看看。 “存储空间不足 无法处理此命令”原因&#xff1a; 第一是您的内存或虚拟内存空间不足&#xff0…

计算机提示存储空间不足怎么办,Win7软件提示"存储空间不足,无法处理此命令"怎么办...

使用过电脑的人应该都有遇到打开软件时出现”存储空间不足&#xff0c;无法处理此命令”的错误&#xff0c;导致软件无法打开。这种错误一般是由于运行内存不足导致的&#xff0c;现如今硬盘的容量不断扩大&#xff0c;而内存的容量却发展缓慢&#xff0c;导致内存跟不上硬盘&a…

fastdfs存储空间不足报错:错误码:28,错误信息:没有足够的存储空间

由于公司挂载在根目录下的网盘只有300G&#xff0c;使用了将近3年左右&#xff0c;最近公司同事反映上传上去的视频无法播放一直报错&#xff0c;查看后台报错信息如下 错误码&#xff1a;28&#xff0c;错误信息&#xff1a;没有足够的存储空间 查看服务器存储空间 df -h由于…

图形讲解git使用教程(附PDF下载)

下载地址&#xff1a;图形讲解git使用教程PDF版下载 图形讲解git使用教程 一、开发1. 安装git.exe2. 生成SSH公钥4. 设置用户名&#xff0c;邮箱5. 设置GitLab密钥6. 提交代码到GitLab7. 常用操作1. 还原修改2. 部分commit后push失败1. 保留本地修改2. 放弃本地修改&#xff0c…