在网上看到通配符匹配的
C语言实现,代码很漂亮。如果使用递归,代码可以更清晰一些,以下是我修改之后的代码:
int wildcard_matches(const char *wildcard, const char *str) {
if (*wildcard == '\0')
return *str == '\0';
if (*wildcard == '?')
return wildcard_matches(++wildcard, ++str);
else if (*wildcard == '*') {
for (++wildcard; *str; ++str)
if (wildcard_matches(wildcard, str))
return TRUE;
return *wildcard == '\0';
} else
return *wildcard == *str && wildcard_matches(++wildcard, ++str);
}
我曾用java实现过通过符匹配,思想是将wildcard用'*'分割成多个部分,然后对每个部分进行匹配,因为时间效率可以达到O(k),这种算法看起来效率更高(对此我十分怀疑),但实现却比上面要复杂得多,花了差不多一个下午才实现并测试完毕,中间出现许多bug,多次的bug修复导致代码惨不忍睹,测试通过之后,我不想再碰那个代码。而上面的C语言代码我花了不到一个小时(并不快),中间出现一个bug,但我很快就修复了,实现完成之后,我仔细阅读了代码,深叹其实现之优雅。这就不同代码带来的巨大差异。《代码之美》第一章讲的是一个简易的正则表达式实现,现在看来其优雅程序当然要超过我上面的代码,但我当初却没有太多感觉,仅仅是因为我没有实现过正则表达式。从这点上来说,程序员不仅需要多读优秀的代码,也要经常写代码,哪怕是再重新实现一遍。
好代码的好处是很容易优化,上面的代码使用递归来实现,通过“代码变换”很容易将"尾递归"改成使用"while循环",如下:
int wildcard_matches(const char *wildcard, const char *str) {
while (1) {
if (*wildcard == '\0')
return *str == '\0';
if (*wildcard == '?') {
++wildcard; ++str;
} else if (*wildcard == '*') {
for (++wildcard; *str; ++str)
if (wildcard_matches(wildcard, str))
return TRUE;
return *wildcard == '\0';
} else {
if (*wildcard != *str)
return FALSE;
++wildcard; ++str;
}
}
}
这几乎是某种直译:将整个body套在while(1)循环中,然后删掉尾递归。再通过一些“代码变换”,很容易将上面再简化:
int wildcard_matches2(const char *wildcard, const char *str) {
for (;*wildcard; ++wildcard, ++str)
if (*wildcard == '*') {
for (++wildcard; *str; ++str)
if (wildcard_matches(wildcard, str))
return TRUE;
return *wildcard == '\0';
} else if (*wildcard != '?')
if (*wildcard != *str)
return FALSE;
return *str == '\0';
}
上面的代码仍然易懂,只比递归版本要稍微复杂一点,重要的是从递归版本变成迭代版本并不费力。
分享到:
相关推荐
在IT领域,编程语言是构建各种软件...易语言的语法简洁,易于理解和编写,使得即使是初学者也能快速掌握通配符匹配的实现方法。如果你需要更高级的匹配功能,可以考虑引入正则表达式库,这将提供更强大的文本处理能力。
文件名通配符,比如:*.txt,?.txt。一个通配符匹配算法,一个ANSI C函数就OK了
### 文件通配符匹配知识点详解 #### 一、文件通配符基础知识 在计算机科学领域,文件通配符(File Wildcards)是一种用于模糊匹配文件名的符号集合,主要用于操作系统命令行工具中进行文件筛选。通配符可以简化对...
通配符匹配是一种在计算机科学中常见的算法问题,它涉及到字符串处理和模式匹配。这个算法主要用于文本搜索、文件查找等领域,允许用户使用特殊字符(如星号(*)和问号(?))来代表任意数量的字符或单个字符。在本案例...
' 和 '*' 的通配符匹配。 # '?' 可以匹配任何单个字符。 # '*' 可以匹配任意字符串(包括空字符串)。 # 两个字符串完全匹配才算匹配成功。 # 说明: # s 可能为空,且只包含从 a-z 的小写字母。 # p 可能为...
在本压缩包文件中,我们关注的是C语言的编程学习,特别是通过LeetCode平台上的第44题——“通配符匹配”来进行实践。LeetCode是一个广受欢迎的在线编程挑战平台,它帮助开发者提高编程技能,尤其是对于算法和数据...
C++实现字符串匹配函数,匹配中可以包括通配符
通配符匹配.md
' 和 '*' 匹配规则的通配符匹配: '?' 可以匹配任何单个字符。 '*' 可以匹配任意字符序列(包括空字符序列)。 判定匹配成功的充要条件是:字符模式必须能够 完全匹配 输入字符串(而不是部分匹配)。 示例 1: ...
44通配符匹配.zip
本题解将聚焦于LeetCode第44题——通配符匹配,通过Python来解答这个问题。 通配符匹配问题在计算机科学中属于字符串匹配的范畴,它涉及到如何判断一个字符串是否符合特定的通配符模式。在LeetCode的第44题中,我们...
在Node.js环境中,文本处理是常见的任务之一,而“matcher”就是这样一个用于简单通配符匹配的工具。本文将深入探讨“matcher”库及其在Node.js中的应用。 首先,Matcher库是由Sindre Sorhus开发的,他是一位知名的...
第44题"通配符匹配"是LeetCode中的一个经典问题,它涉及到字符串处理和动态规划等核心编程概念。在这个问题中,你需要实现一个函数来判断一个给定的字符串(字符串s)是否可以被另一个包含通配符(*和?)的字符串...
带通配符的字符串匹配算法则是这个领域的延伸,它允许在模式字符串中包含特殊字符,如星号(*)或问号(?),以表示任意字符或单个任意字符。这种算法使得搜索更加灵活,可以适应更复杂的查询需求。 **通配符的含义** -...
通配符匹配是一种在字符串比较中使用特殊字符(如 '?' 和 '*')来表示灵活匹配的机制。在这个问题中,我们面临的是一个编程挑战,通常在LeetCode等在线平台出现,目的是测试开发者的算法和逻辑思维能力。以下是这个...
C语言标准库中提供了一个名为`<stdio.h>`的头文件,其中包含了`wildcard_match`函数,用于进行通配符匹配。但请注意,这个函数并非标准C库的一部分,而是某些开发环境或库提供的扩展。实际应用中,我们可能需要自己...
先用如“7-Zip”解压软件将regexp.shar.Z解压为regexp.shar。再将regexp.shar拷贝至Desktop Linux下,在命令行终端用 sh regexp.shar解压它,然后就可以看到各文件了。
matcher简单的通配符匹配,当您要接受松散的字符串输入并且正则表达式/ glob太复杂时,很有用。 安装$ npm install --save matcher用法const matcher = require('matche matcher简单的通配符匹配当您想接受松散的...
通配符模式匹配是计算机科学中的一个重要概念,特别是在文本处理、搜索算法以及文件系统路径匹配等领域广泛应用。在给定的场景中,我们关注的是如何设计一个算法来处理包含特殊字符`?`和`*`的模式串,并在主串中找到...
在易语言编程环境中,"匹配通配符API源码"是指使用特定的API函数来实现对字符串进行通配符匹配的功能。易语言是一种简洁、直观的中文编程语言,旨在降低编程难度,让更多人能参与到程序设计中。在这个场景中,"SanYe...