Question
字符串1:只含有英文字母
字符串2:含有英文字母和*,其中符号*表示匹配任意字符0或者多次,即正则表达式里面的含义。
现在给定这样的两个串,要求判断是否匹配?
bool isMatch ( const char *str1, const char *str2)
例如:str1 = “hello”, str2 = “he*o”,则二者匹配,返回true,str1 = “hello”, str2 = “he*l”,则不匹配,返回false。
Solution
关键是如何处理*,首先想到的就是回溯,在纸上画了一下得到如下算法
设输入是两个字符串 s, t, 其中t可能包含* <.p>
1.当*t不是*的时候, 就像普通的串匹配一样, 移动s和t
2.当*t是*的时候, 假设*t后面第一个不是*的字符是x, 若x是null, 直接匹配成功, 否则在s中找到当前位置后所有字符x的位置, 这时候问题转化成了t中x后的串和s中当前位置以后所有以x为开始的串的匹配问题, 递归调用即可, 其中任意一个匹配成功, 则原串匹配成功, 若都没有匹配成功则匹配失败.
3.当*s和*t其中一个是null时 跳出循环, 若此时 *t == ‘*’, 则++t 知道 t != ‘*’, 这时若 *t == 0 则代表匹配成功, 否则匹配失败。
代码如下:
#include <cstring>
#include <iostream>
using namespace std;
bool is_match(const char * s, const char * t)
{
while (*s && *t)
{
if (*t != '*' && *s == *t)
++s, ++t;
else if (*t != '*' && *s != *t)
return false;
else if (*t == '*')
{
do ++t; while (*t == '*');
if (*t == 0) return true;
for ( ; *s; ++s)
if (*s == *t && is_match(s+1, t+1))
return true;
return false;
}
}
while (*t == '*') ++t;
if (*s == *t) return true;
else return false;
}
int main(int argc, char * argv[])
{
if (is_match(argv[1], argv[2]))
cout << "match" << endl;
else cout << "not match" << endl;
return 0;
}
分享到:
相关推荐
在JavaScript中,正则表达式同样发挥着重要作用,尤其是在Node.js环境中进行字符串模式匹配时。本文将详细介绍如何在JavaScript中使用正则表达式进行字符串的模式匹配、提取以及替换。 #### 二、基本概念 正则...
**BM字符串匹配算法详解** BM(Boyer-Moore)算法是计算机科学中用于文本字符...同时,通过对比其他字符串匹配算法,如KMP、Rabin-Karp等,可以更好地了解各种算法的适用场景和性能差异,为实际问题选择最佳解决方案。
在编程领域,字符串括号匹配是一项基础且重要的任务,它涉及到语法分析和编译原理。在C语言中,我们可以利用栈这一数据结构来解决这个问题。本文将深入探讨字符串括号匹配的概念、C语言的实现方法以及相关的编程技巧...
3. `String.prototype.test()`方法的应用:`test()`是JavaScript字符串对象的一个方法,它使用正则表达式来测试字符串,如果正则表达式与字符串匹配,则返回`true`,否则返回`false`。在给出的代码片段中,`reg.test...
Pratt三位学者在1970年提出的一种高效的字符串匹配算法,它主要用于解决在一个大文本串中查找是否存在一个特定模式串的问题。KMP算法的效率在于它避免了对相同字符的重复比较,通过构建部分匹配表来指导匹配过程,...
3. **字符串匹配算法**:为了查找指定字符串,程序可能使用简单的线性搜索,或者更高效的算法如KMP(Knuth-Morris-Pratt)或Boyer-Moore,这些算法可以减少不必要的字符比较,提高搜索效率。 4. **多线程处理**:...
NSLog(@"字符串非空或含有非空白字符"); } ``` 正则表达式`"^\\s*$"`匹配零个或多个空白字符,包括空格、制表符等。 ### 5. 自定义扩展 为了方便使用,可以创建一个分类来扩展`NSString`,添加一个便捷的方法来...
在C语言中,字符串匹配是计算机科学中一个重要的问题,主要应用于文本处理、搜索算法等领域。本文将介绍如何使用C语言解决字符串匹配问题,特别是通过KMP(Knuth-Morris-Pratt)算法来实现。 KMP算法是一种不回溯的...
在C++编程中,处理字符串是一项常见的任务,尤其是在开发涉及文本处理的应用程序时。C++提供了多种方法来处理和操作字符串,包括标准库中的`std::string`类以及MFC库中的`CString`类。本篇文章将深入探讨如何在C++的...
在给定的标题和描述中,我们关注的是如何创建一个包含数字、大写字母和小写字母的随机字符串,且长度可指定。这样的字符串通常具有较高的复杂度,能提供更好的安全性。 生成这种随机字符串的方法通常涉及编程语言中...
因此,在处理含有中文的字符串时,简单的字符计数并不准确,需要考虑字符的实际编码长度。 #### 三、函数实现原理 本示例中的`subString`函数通过以下步骤实现了中文字符串的精准截取: 1. **初始化变量**:定义...
当然,也可以使用更复杂的数据结构,如Trie树或字典树,来加速字符串匹配。 4. **多线程/异步处理**:对于大型目录结构,为提高性能,我们可以利用多线程或多进程并发处理文件。例如,在Python中,可以使用`...
当我们要判断两个字符串是否含有相同或相近的信息时,这类算法就显得尤为重要。以下是几种常见的字符串相似度比较算法的详细解释: 1. **Levenshtein 距离**: Levenshtein 距离(也称为编辑距离)是衡量两个字符...
本实例关注的是一个特定的字符串匹配问题,其中每个字符串最多包含一个星号(*)和任意数量的问号(?)。这里的*代表任意长度的字符串,而?则代表单个字符。我们的目标是检测两个这样的字符串是否冲突。 首先,我们...
在这款字符串搜索小工具中,QT库被用来构建程序的界面和实现文件系统的遍历以及字符串匹配功能。 在使用这款工具时,用户首先需要指定一个目录路径,这是搜索范围的起点。用户还可以选择只针对特定类型的文件进行...
在JavaScript中,字符串匹配是一个常见的任务,特别是在处理用户输入或者正则表达式时。本案例主要探讨了在特定条件下如何判断两个字符串是否匹配,重点在于处理字符串中的特殊字符"*"和"?"。这两个字符在正则表达式...
3. **搜索引擎**:搜索引擎的核心功能之一就是能够快速准确地从海量数据中找到包含特定关键词的信息,这背后也涉及到大量的字符串匹配算法。 4. **编译器**:编译器在词法分析阶段会识别源代码中的各种标识符、...