python带通配符的字符串匹配算法_带有通配符的字符串匹配算法-C/C++

2013-09-13 22:22:50

日前某君给我出了这样一道题目:两个字符串,一个是普通字符串,另一个含有*和?通配符,*代表零个到多个任意字符,?代表一个任意字符,通配符可能多次出现。写一个算法,比较两个字符串是否相等。 我花了四个小时写出两种算法来解决这个问题,简单地测试了一下,好使!

//方法一,从无通配符到有?再到有*,逐步推进分析

char strMatch( const char *str1, const char *str2)

{

int slen1 = strlen(str1);

int slen2 = strlen(str2);

//实际使用时根据strl的长度来动态分配表的内存

char matchmap[128][128];

memset(matchmap, 0, 128*128);

matchmap[0][0] = 1;

int i, j, k;

//遍历目标字符串符串

for(i = 1; i<= slen1; ++i)

{

//遍历通配符串

for(j = 1; j<=slen2; ++j)

{

//当前字符之前的字符是否已经得到匹配

if(matchmap[i-1][j-1])

{

//匹配当前字符

if(str1[i-1] == str2[j-1] || str2[j-1] == '?')

{

matchmap[i][j] = 1;

//考虑星号在末尾的情况

if( i == slen1 && j < slen2)

{

for ( k = j+1 ; k <= slen2 ; ++k )

{

if( '*' == str2[k-1])

{

matchmap[i][k] = 1;

}else{

break;

}

}

}

}else if(str2[j-1] == '*')

{

//遇到星号,目标字符串到末尾都能得到匹配

for(k = i-1; k<=slen1; ++k)

{

matchmap[k][j] = 1;

}

}

}

}

//如果当前字符得到了匹配则继续循环,否则匹配失败

for(k = 1; k<=slen2; ++k)

{

if(matchmap[i][k])

{

break;

}

}

if(k>slen2)

{

return 0;

}

}

return matchmap[slen1][slen2];

}

//方法二,分析每个情况。

char strMatch( const char *str1, const char *str2)

{

int slen1 = strlen(str1);

int slen2 = strlen(str2);

//实际使用时根据strl的长度来动态分配表的内存

char matchmap[128][128];

memset(matchmap, 0, 128*128);

int i, j, k;

//定义内循环的范围

int lbound = 0;

int upbound = 0;

//遍历目标字符串符串

for(i = 0; i< slen1; ++i)

{

//遍历通配符串

int bMatched = 0;

int upthis = upbound;

for(j = lbound; j<=upthis ; ++j)

{

//匹配当前字符

if(str1[i] == str2[j] || str2[j] == '?')

{

matchmap[i][j] = 1;

if(0 == bMatched)

{

lbound = j+1;

}

upbound = j+1;

bMatched = 1;

if(i == slen1 - 1)

{

//考虑末尾是*的特殊情况

for(k = j+1 ; k < slen2 && '*' == str2[k] ; ++k)

{

matchmap[i][k] = 1;

}

}

}else if(str2[j] == '*')

{

if(0 == bMatched)

{

lbound = j;

}

//遇到星号,目标字符串到末尾都能得到匹配

for(k = i; k< slen1; ++k)

{

matchmap[k][j] = 1;

}

k = j;

while( '*' == str2[++k])

{

matchmap[i][k] = 1;

}

if(str1[i] == str2[k] || str2[k] == '?')

{

matchmap[i][k] = 1;

upbound = k+1;

if(i == slen1 - 1)

{

//考虑末尾是*的特殊情况

for(k = k+1 ; k < slen2 && '*' == str2[k] ; ++k)

{

matchmap[i][k] = 1;

}

}

}else{

upbound = k;

}

bMatched = 1;

}

}

//居然没有匹配到

if(!bMatched )

{

return 0;

}

}

return matchmap[slen1-1][slen2-1];

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/513066.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入解读 Flink SQL 1.13

简介&#xff1a; Apache Flink 社区 5 月 22 日北京站 Meetup 分享内容整理&#xff0c;深入解读 Flink SQL 1.13 中 5 个 FLIP 的实用更新和重要改进。 本文由社区志愿者陈政羽整理&#xff0c;Apache Flink 社区在 5 月份发布了 1.13 版本&#xff0c;带来了很多新的变化。文…

2021计算机应用基础统考,2021年度计算机应用基础统考练习题及答案.doc

计算机应用基本统考练习题及答案(1)?一、选取题(1)&#xff1a;1.?????? 计算机中存储数据最小单位是 C??? 。A.位???? B.字???? C. 字节?? D.KB2.?????? 在微机中&#xff0c;访问速度最快存储器是 D??? 。A.硬盘??? B. 光盘?? C.软盘 D.内…

centos8共享文件夹挂载_CentOS 8 安装并配置NFS服务

NFS网络文件系统(Network File System)是一种分布式文件系统协议&#xff0c;通过网络共享远程目录。使用NFS&#xff0c;可以在系统上挂载远程目录&#xff0c;并像对待本地文件一样使用远程计算机上的文件。默认情况下&#xff0c;NFS协议未加密&#xff0c;并且与Samba不同&…

Flink 1.13,面向流批一体的运行时与 DataStream API 优化

简介&#xff1a; 在 1.13 中&#xff0c;针对流批一体的目标&#xff0c;Flink 优化了大规模作业调度以及批执行模式下网络 Shuffle 的性能&#xff0c;以及在 DataStream API 方面完善有限流作业的退出语义。 本文由社区志愿者苗文婷整理&#xff0c;内容来源自阿里巴巴技术专…

启动metabase_引入开源BI软件Metabase——数据分析平台建设(一)

引入BI系统是减少重复劳动、增加产出的必要手段和步骤什么是Metabase在选择使用Metabase之前&#xff0c;也调研过许多BI软件&#xff0c;满足免费开源&#xff0c;灵活多变&#xff0c;我们选择了Metabase。Metabase是一款开源免费的BI软件&#xff0c;适用于中小型企业、初创…

深入剖析数据多版本 MVCC 机制

作者 | 奇伢来源 | 奇伢云存储你以为删掉就没事了&#xff1f;有些童鞋以前还真是做过些傻事&#xff0c;以为删掉一些东西&#xff0c;覆盖一些东西就能掩盖某一些"不可告人"的秘密。来看看 etcd 的例子&#xff1a;./etcdctl put 张三 是个憨憨哎呀&#xff0c;这可…

计算机学3d建模吗,计算机三维建模与动画基础

计算机三维建模与动画基础语音编辑锁定讨论上传视频《计算机三维建模与动画基础》是2008年清华大学出版社出版的图书&#xff0c;作者是张烈&#xff0c;骆春慧。书 名计算机三维建模与动画基础作 者张烈&#xff0c;骆春慧ISBN9787302172123类 别计算机技术页 数2…

同程旅行基于 RocketMQ 高可用架构实践

简介&#xff1a; 我们在几年前决定引入 MQ 时&#xff0c;市场上已经有不少成熟的解决方案&#xff0c;比如 RabbitMQ , ActiveMQ&#xff0c;NSQ&#xff0c;Kafka 等。考虑到稳定性、维护成本、公司技术栈等因素&#xff0c;我们选择了 RocketMQ。 背景介绍 ​ 为何选择 R…

finalize方法_final,finally,finalize三者的含义和区别

final表示不可变的&#xff0c;它可以用来修饰类&#xff0c;方法和变量。当它修饰类的时候表示该类是不能被继承的&#xff0c;因为抽象类就是用来被继承的&#xff0c;所以abstract关键字和final关键字不能共存。当它修饰方法的时候表示该方法是不能被重写的。当它修饰变量的…

重磅 | 数据库自治服务DAS论文入选全球顶会SIGMOD,领航“数据库自动驾驶”新时代

简介&#xff1a; 近日&#xff0c;智能数据库和DAS团队研发的智能调参ResTune系统论文被SIGMOD 2021录用&#xff0c;SIGMOD是数据库三大顶会之首&#xff0c;是三大顶会中唯一一个Double Blind Review的&#xff0c;其权威性毋庸置疑。 近日&#xff0c;智能数据库和DAS团队…

python列向输出字符串_Python读取字符串按列分配后按行输出

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里技术人对外发布原创技术内容的最大平台&…

计算机论文哪儿找,查找关于计算机毕业论文.docx

查找关于计算机毕业论文计算机科学技术对现代教育的应用摘要&#xff1a;计算机技术以其便捷性、高可拓展性和丰富的表现形式在现代教育教学工作中发挥着重要的作用&#xff0c;本文简单分析计算机技术在现代教育教学工作中的作用&#xff0c;给出了其具体的应用方式和一些思路…

如何帮用户管好云账本?阿里云数据库助力收钱吧 | 甲子光年

简介&#xff1a; “收钱吧到账100万”成为普通商家最想听到的声音。 你有多久没摸过现金了&#xff1f; 中国互联网络信息中心发布的第47次《中国互联网络发展状况统计报告》数据显示&#xff0c;截至2020年12月&#xff0c;我国移动支付用户规模达到8.54亿&#xff1b;中国人…

Redis 会遇到的「坑」,你踩过几个?

作者 | Magic Kaito来源 | 水滴与银弹这篇文章&#xff0c;我想和你聊一聊在使用 Redis 时&#xff0c;可能会踩到的「坑」。如果你在使用 Redis 时&#xff0c;也遇到过以下这些「诡异」的场景&#xff0c;那很大概率是踩到「坑」了&#xff1a;明明一个 key 设置了过期时间&a…

bert 多义词_自然语言处理:Bert及其他

以下内容主要参考了文末列出的参考文献&#xff0c;在此表示感谢&#xff01;2018年被认为是NLP技术的new era的开始。在这一年&#xff0c;提出了多种有创新性的技术&#xff0c;而且最后的集大成者Bert在NLP的多项任务中屠榜&#xff0c;造成的震撼不比当初神经网络初次在Ima…

谈谈JVM内部锁升级过程

简介&#xff1a; 对象在内存中的内存布局是什么样的&#xff1f;如何描述synchronized和ReentrantLock的底层实现和重入的底层原理&#xff1f;为什么AQS底层是CASvolatile&#xff1f;锁的四种状态和锁升级过程应该如何描述&#xff1f;Object o new Object() 在内存中占用多…

性能测试在软件测试中的位置,性能测试的响应时间,你真的算对了吗?

今天对nginx的accesslog中响应时间进行性能测试时&#xff0c;发现有个接口&#xff0c;直接返回数据&#xff0c;平均的响应时间也比较大。网上查了下&#xff0c;原来log中用的响应时间是$request_time&#xff0c;它包含了用户数据接收时间&#xff0c;而真正程序的响应时间…

JetBrains发布两项重要更新:基于IDE的远程开发解决方案、轻量级编辑器Fleet

近日&#xff0c;JetBrains 对外发布两项重要产品更新&#xff1a;专为云端和其他服务器打造的远程开发解决方案&#xff0c;以及轻量级编辑器Fleet。 为IntelliJ 平台引入远程开发支持 在近期陆续发布的2021.3 版本的各 IDE 中&#xff0c;JetBrains 向 IntelliJ 平台添加了远…

Hologres揭秘:优化COPY,批量导入性能提升5倍+

简介&#xff1a; 揭秘Hologres优化COPY的技术原理&#xff0c;实现批量导入性能提升5倍 Hologres&#xff08;中文名交互式分析&#xff09;是阿里云自研的一站式实时数仓&#xff0c;这个云原生系统融合了实时服务和分析大数据的场景&#xff0c;全面兼容PostgreSQL协议并与…

io密集型和cpu密集型_一次说明白Python爬虫中多线程,多进程,异步IO编程

图/文&#xff1a;迷神我们在Python爬虫中&#xff0c;重要的是讲究速度&#xff0c;如果有10万或者100万Url地址&#xff0c;写过爬虫的都会知道&#xff0c;那估计是非常慢的。我们的Python爬虫一般IO密集型业务&#xff0c;Python爬虫程序需要发起网络请求&#xff0c;必然就…