c语言实现的带通配符匹配算法
原创代码。
‘?'代表任意单个字符,‘*'代表任意0个或多个字符。常用于文件的搜素匹配。
bool MatchWithAsteriskW(wchar_t* str1, wchar_t* pattern) { if (str1 == NULL) return false; if (pattern == NULL) return false; int len1 = lstrlenW(str1); int len2 = lstrlenW(pattern); int mark = 0;//用于分段标记,'*'分隔的字符串 int p1 = 0, p2 = 0; while (p1<len1 && p2<len2) { if (pattern[p2] == '?') { p1++; p2++; continue; } if (pattern[p2] == '*') { /*如果当前是*号,则mark前面一部分已经获得匹配, *从当前点开始继续下一个块的匹配 */ p2++; mark = p2; continue; } if (str1[p1] != pattern[p2]) { if (p1 == 0 && p2 == 0) { /* * 如果是首字符,特殊处理,不相同即匹配失败 */ return false; } /* * pattern: ...*bdef*... * ^ * mark * ^ * p2 * ^ * new p2 * str1:.....bdcf... * ^ * p1 * ^ * new p1 * 如上示意图所示,在比到e和c处不想等 * p2返回到mark处, * p1需要返回到下一个位置。 * 因为*前已经获得匹配,所以mark打标之前的不需要再比较 */ p1 -= p2 - mark - 1; p2 = mark; continue; } /* * 此处处理相等的情况 */ p1++; p2++; } if (p2 == len2) { if (p1 == len1) { /* * 两个字符串都结束了,说明模式匹配成功 */ return true; } if (pattern[p2 - 1] == '*') { /* * str1还没有结束,但pattern的最后一个字符是*,所以匹配成功 * */ return true; } } while (p2<len2) { /* * pattern多出的字符只要有一个不是*,匹配失败 * */ if (pattern[p2] != '*') return false; p2++; } return true; }
以上所述就是本文的全部内容了,希望大家能够喜欢。
相关推荐
-
对C语言中递归算法的深入解析
许多教科书都把计算机阶乘和菲波那契数列用来说明递归,非常不幸我们可爱的著名的老潭老师的<C语言程序设计>一书中就是从阶乘的计算开始的函数递归.导致读过这本经书的同学们,看到阶乘计算第一个想法就是递归.但是在阶乘的计算里,递归并没有提供任何优越之处.在菲波那契数列中,它的效率更是低的非常恐怖. 这里有一个简单的程序,可用于说明递归.程序的目的是把一个整数从二进制形式转换为可打印的字符形式.例如:给出一个值4267,我们需要依次产生字符'4','2','6',和'7'.就如在printf函数中使用
-
C语言解决百钱买百鸡问题
我国古代数学家张丘建在<算经>一书中曾提出过著名的"百钱买百鸡"问题,该问题叙述如下:鸡翁一,值钱五:鸡母一,值钱三:鸡雏三,值钱一:百钱买百鸡,则翁.母.雏各几何? 翻译过来,意思是公鸡一个五块钱,母鸡一个三块钱,小鸡三个一块钱,现在要用一百块钱买一百只鸡,问公鸡.母鸡.小鸡各多少只? 题目分析 如果用数学的方法解决百钱买百鸡问题,可将该问题抽象成方程式组.设公鸡x只,母鸡y只,小鸡z只,得到以下方程式组: A:5x+3y+1/3z = 100 B:x+y+z = 100
-
c语言实现冒泡排序、希尔排序等多种算法示例
实现以下排序 插入排序O(n^2) 冒泡排序 O(n^2) 选择排序 O(n^2) 快速排序 O(n log n) 堆排序 O(n log n) 归并排序 O(n log n) 希尔排序 O(n^1.25) 1.插入排序 O(n^2) 一般来说,插入排序都采用in-place在数组上实现.具体算法描述如下:⒈ 从第一个元素开始,该元素可以认为已经被排序⒉ 取出下一个元素,在已经排序的元素序列中从后向前扫描⒊ 如果该元素(已排序)大于新元素,将该元素移到下一位置⒋ 重复步骤3,直到找到已排序的元素
-
c语言快速排序算法示例代码分享
步骤为:1.从数列中挑出一个元素,称为 "基准"(pivot);2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边).在这个分区退出之后,该基准就处于数列的中间位置.这个称为分区(partition)操作.3.递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序.递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了.虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iterat
-
C语言快速幂取模算法小结
本文实例汇总了C语言实现的快速幂取模算法,是比较常见的算法.分享给大家供大家参考之用.具体如下: 首先,所谓的快速幂,实际上是快速幂取模的缩写,简单的说,就是快速的求一个幂式的模(余).在程序设计过程中,经常要去求一些大数对于某个数的余数,为了得到更快.计算范围更大的算法,产生了快速幂取模算法.我们先从简单的例子入手:求abmodc 算法1.直接设计这个算法: int ans = 1; for(int i = 1;i<=b;i++) { ans = ans * a; } ans = ans %
-
C语言位图算法详解
本文详细讲述了位图算法的定义与C语言实现方法,分享给大家供大家参考之用.具体如下: 位图法定义: 位图法就是bitmap的缩写,所谓bitmap,是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况.通常是用来判断某个数据存不存在的. 例如,要判断一千万个人的状态,每个人只有两种状态:男人,女人,可以用0,1表示.那么就可以开一个int数组,一个int有32个位,就可以表示32个人.操作的时候可以使用位操作. 数据结构: unsigned int bit[N]; 在这个数组
-
C语言实现的排列组合问题的通用算法、解决方法
尽管排列组合是生活中经常遇到的问题,可在程序设计时,不深入思考或者经验不足都让人无从下手.由于排列组合问题总是先取组合再排列,并且单纯的排列问题相对简单,所以本文仅对组合问题的实现进行详细讨论.以在n个数中选取m(0<m<=n)个数为例,问题可分解为: 1. 首先从n个数中选取编号最大的数,然后在剩下的n-1个数里面选取m-1个数,直到从n-(m-1)个数中选取1个数为止. 2. 从n个数中选取编号次小的一个数,继续执行1步,直到当前可选编号最大的数为m. 很明显,上述方法是一个递归的过程,也
-
C语言实现斗地主的核心算法
数据结构只选择了顺序表,没有选择链表,灵活性和抽象性不足,不能普适. head.h #ifndef __HEAD_H__ #define __HEAD_H__ #define MAXLEVEL 15 typedef struct CARD{ int number; int level; char *flower; char point; }card;//卡 typedef struct DECK{ int top; int arr[55]; }deck;//牌堆 typedef struct P
-
c语言实现的带通配符匹配算法
原创代码. '?'代表任意单个字符,'*'代表任意0个或多个字符.常用于文件的搜素匹配. bool MatchWithAsteriskW(wchar_t* str1, wchar_t* pattern) { if (str1 == NULL) return false; if (pattern == NULL) return false; int len1 = lstrlenW(str1); int len2 = lstrlenW(pattern); int mark = 0;//用于分段标记,
-
Go语言中关闭带缓冲区的频道实例分析
本文实例分析了Go语言中关闭带缓冲区的频道.分享给大家供大家参考.具体分析如下: Go语言提供了两种频道,带缓冲区和不带缓冲区的.不带缓冲区的频道,发送和接收是同步的,必须接收端接收了消息,发送端才能从发送调用中解脱.带缓冲区的频道,在缓冲区满之前,发送和接收是异步的,发送端的发送操作只保证把消息放入缓冲区. Go的频道是可以关闭的,关闭频道的目的是让接收端知道不会再有消息从这个频道进入,我们可能会用某个频道的关闭来表示某种状态的终结. 当我们关闭一个带缓冲区的频道时,如果缓冲区中还有消息,接收
-
Java 语言实现清除带 html 标签的内容方法
实例如下: public String stripHtml(String content) { // <p>段落替换为换行 content = content.replaceAll("<p .*?>", "\r\n"); // <br><br/>替换为换行 content = content.replaceAll("<br\\s*/?>", "\r\n"); // 去
-
c语言同名标靶点自动匹配算法实现实例代码
1.两个标靶数据 2.匹配结果 3.代码 #include <iostream> #include <vector> #include <math.h> using namespace std; struct Point { int id; float x,y,z; Point(int _id,float _x,float _y,float _z):id(_id),x(_x),y(_y),z(_z){} }; struct Triangle { Point p1,p2,
-
C语言 推理证明带环链表详细过程
目录 什么是带环链表: 判断链表是否带环: 环形链表 I 找带环形链表入环的第一个结点: 环形链表 II 什么是带环链表: 带环链表是链表最后一个结点的指针域不是指向空指针,而是指向链表之前的结点,这样就形成了环状的链表结构. 如图所示: 判断链表是否带环: 那么问题来了,如何判断一个链表是否带环呢? 这里我们再次运用了快慢指针,但是快慢指针又该如何具体设置呢? 判断思路: 先定义一个快指针fast,一个慢指针slow. 快指针一定是比慢指针先进环的,当slow进环时,fast指针便开始了追sl
-
R语言-如何读写带分隔符的文件
有众多的格式和文本文件标准可用于存储数据.用于存储数据的通用格式为分隔符值(即CSV或制表符分割文件).可扩展标记语言(XML).JavaScript对象表示法(JSON) 将数据存储在文本文件中的主要优点是:他们可被几乎所有的其他数据分析软件或人读取 R语言提供丰富的函数来读取不同格式的数据,包括: 文本文件(TXT文件) 逗号分隔文件(CSV文件) TXT文件--read.table() 矩形(类似电子表格的)数据通常存储在带有分隔符的文件中,特别是逗号分隔值(CSV)和制表符分隔值文件.r
-
详解易语言导入语言包方法
可能有不少软件作者因为语言包的问题而纠结,因为易语言没自带导入语言包的命令,所以只能用最普通的方式来导入语言包 1.新建一个"易语言"窗口程序 2.然后在桌面创建两个语言配置文件 你可以选择自己喜爱的语言 我在这里创建了英语和中文两个语言配置文件 3.组件有一个按钮 六个标签 两个单选框 标签内容对应语言配置文件 你可以根据自己喜爱更改 我只是举个例子 4.具体代码如下: .版本 2 .支持库 shell .程序集 窗口程序集_启动窗口 .程序集变量 语言, 文本型 .子程序 导入语言
-
详解MFC/C++调用易语言的整数型和文本型与VS2010互动
1.LoadDll.cpp #include "StdAfx.h" #include "LoadDLL.h" pMFCdll_OneVOID_OneVOID MFCdll_OneVOID_OneVOID; pMFCdll_OneWORD_OneVOID MFCdll_OneWORD_OneVOID; pMFCdll_OneCHAR_OneVOID MFCdll_OneCHAR_OneVOID; pMFCdll_OneWORD_OneWORD MFCdll_OneWO
-
易语言注册热键的步骤教学
本经验介绍如何用易语言注册热键 首先 打开易语言 新建一个windows窗口程序 如图 易语言有自带的注册热键命令 他在扩展功能支持库的热键功能里面 如果找不到此命令 请打开工具 再选支持库配置 找到扩展功能支持库 然后勾选上 点击确定即可 然后我们在添加一个标签 用来反馈事件 双击启动窗口 进入到启动窗口创建完毕事件子程序 写 注册热键 参数一为窗口句柄 取启动窗口的句柄即可 参数2为标签句柄 用来反馈热键事件 参数3为功能键 比如shift+F键 shift就是功能键 默认
-
实现易语言界面库
易语言IDE自带了界面库,是通过"支持库(DLL)"来提供的.脱离这些库,你想写自己的界面程序? 易毕竟不是C.没有Win32 SDK .从常量到API声明.光这些工作就能把你累个差不多. 以前也写过一个界面库.不过自己不是很满意.易语言写界面库.首要考虑的是效率问题.当然可以用内联汇编.不过易语言的内联汇编只能是置入机器码.因为填入的是机器码,当然不能链接,因此不能访问全局变量.也不能访问外部函数,包括用汇编调用API.巨麻烦!因此,填入的机器码最多也就能访问局部变量和传递进来的参数
随机推荐
- MySql 5.7.20安装及data和my.ini文件的配置
- 详解Vue.use自定义自己的全局组件
- Java设计模式之装饰模式(Decorator模式)介绍
- oracle 优化的一点体会
- 深入理解Python对Json的解析
- JQueryEasyUI datagrid框架的进阶使用
- javascript仿百度输入框提示自动下拉补全
- PHP简单遍历对象示例
- 分享Android平板电脑上开发应用程序不能全屏显示的问题解决
- jsp Hibernate入门教程第1/3页
- 深入分析Mysql中limit的用法
- 基于MYSQL中优化的一些方法
- Mysql在debian系统中不能插入中文的终极解决方案
- java中建立0-10m的消息(字符串)实现方法
- C#自定义控件实现TextBox禁止粘贴的方法
- yepnope.js 异步加载资源文件
- Ruby中的方法(函数)学习总结
- jQuery学习笔记 操作jQuery对象 CSS处理
- jquery自动补齐功能插件flexselect用法示例
- js查找某元素中的所有图片地址的方法