[OpenJudge]带有通配符的字符串匹配

#include <iostream>

#include <stdlib.h>

#include <string.h>

using namespace std;

/*

字符串匹配

?代表一个字符(不能没有),*可以代表任意多个字符(可以为空)

?表示任意字符,也就是说?永远可以匹配成功,本质上,只要遇到?就一定匹配

*的本质,是分割字符串,即如果P=P1*P2,即P得匹配条件是匹配P1串之后,再匹配P2子串

*/

//@param  src[], 带匹配的字符串

//@param  pattern[], 模式字符串

bool MatchWithAsteriskW(const char* str1, const char* pattern)

{

if (str1 == NULL) return false;

if (pattern == NULL) return false;

int len1 = strlen(str1);

int len2 = strlen(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;

}

int main()

{

char inpstr[21];

char ismatch[21];

cin.getline(inpstr,21);

cin.getline(ismatch,21);

char *src = ismatch;

char *pat = inpstr;

if ( MatchWithAsteriskW(src, pat ))

{

cout<<"matched"<<endl;

}

else

cout<<"not matched"<<endl;

return 0;

}

时间: 2024-08-05 19:34:15

[OpenJudge]带有通配符的字符串匹配的相关文章

动态规划 | 带有通配符的字符串匹配(浅显易懂)

带有通配符的字符串匹配 一.Leetcode | 44 Wildcard Matching(只有一个字符串包含通配符) 题目很简单,就是说两个字符串,一个含有通配符,去匹配另一个字符串:输出两个字符串是否一致. 注意:'?'表示匹配任意一个字符,'*'表示匹配任意字符0或者多次 首先,我们想到暴力破解.如果从头到尾的破解,到第二个字符时,是否匹配成功取决于第一个字符是否匹配成功! 所以我们想到应该要用到动态规划: 既然用到动态规划,最重要的是设置初值 和找到递推式: 于是,我们开始分析初值怎么设

COJN 0558 800600带通配符的字符串匹配

800600带通配符的字符串匹配 难度级别:B: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 通配符是一类键盘字符,当我们不知道真正字符或者不想键入完整名字时,常常使用通配符代替一个或多个真正字符.通配符有问号(?)和星号(*)等,其中,“?”可以代替一个字符,而“*”可以代替零个或多个字符.你的任务是,给出一个带有通配符的字符串和一个不带通配符的字符串,判断他们是否能够匹配.例如,1?456 可以匹配 12456.13456.1a45

openjudge6252 带通配符的字符串匹配

描述 通配符是一类键盘字符,当我们不知道真正字符或者不想键入完整名字时,常常使用通配符代替一个或多个真正字符.通配符有问号(?)和星号(*)等,其中,“?”可以代替一个字符,而“*”可以代替零个或多个字符. 你的任务是,给出一个带有通配符的字符串和一个不带通配符的字符串,判断他们是否能够匹配. 例如,1?456 可以匹配 12456.13456.1a456,但是却不能够匹配23456.1aa456: 2*77?8可以匹配 24457798.237708.27798. 输入输入有两行,每行为一个不

含有通配符的字符串匹配

字符串匹配问题,给定两个字符串.求字符串2.在字符串1中的最先匹配结果.字符串2中能够存在'*'符号,且该符号能够代表随意字符,即字符串2中存在通配符. e.g. 输入:abcdefghabef, a*f 输出:abcdef #include <iostream> #include <string> using namespace std; bool Match(const string &s1,const string &s2,string &result

含通配符的字符串匹配问题

题目: 给定两个字符串,求字符串2,在字符串1中的最先匹配结果.字符串2中 可以存在'*'符号,且该符号可以代表任意字符,即字符串2中存在通配符. 例如:输入:abcdefghabef,a*f 输出:abcdef #include<iostream> #include<string> using namespace std; int main() { int i=0,len=0,len1,len2,j=0,begin=0; string s,s1,s2,s3; getline(ci

带通配符的字符串匹配问题

1 /* 2 不使用c,c++库,?表示任意一个,*表示>=0任意,匹配规则要求匹配最大的字符子串,例如a*d ,匹配abbdd而非abbd,即最大匹配字符串 3 input :abcadefg 4 reule : a?c 5 ouput : abc 6 7 input : newsadfanewfdsdsf 8 rule :new 9 output: new new(最后一个不带空格,中间用空格分隔) 10 11 input : breakfastfood 12 rule : f*d 13 o

【python cookbook】【字符串与文本】3.利用shell通配符做字符串匹配

问题:当工作在Linux shell下时,使用常见的通配符模式(即,*.py.Dat[0-9]*.csv等)来对文本做匹配 解决方案:fnmatch模块提供的两个函数fnmatch().fnmatchcase() #fnmatch()的匹配模式所采用的大小写区分规则和底层文件系统相同(根据操作系统的不同 而不同) #fnmatchcase()的匹配模式区分大小写 >>> from fnmatch import fnmatch,fnmatchcase >>> fnmatc

带通配符的字符串匹配(动态规划)

OJ地址:http://noi.openjudge.cn/ch0206/6252/ 1 #include<string> 2 #include<cstdio> 3 #include<iostream> 4 using namespace std; 5 string A,B; 6 bool Judge(int a,int b); 7 void Init(); 8 int main() 9 { 10 // cin>>A>>B;//A with ? o

Python实用技法第22篇:利用Shell通配符做字符串匹配

1.需求 当工作在UNIX Shell下时,我们想使用常见的通配符模式(即:.py,Dat[0-9].csv等)来对文本做匹配. 2.解决方案 fnmatch模块提供了两个函数:fnmatch()和fnmatchcase(),可用来执行这样的匹配,使用起来非常简单. 实例: from fnmatch import fnmatch,fnmatchcase print(fnmatch('mark.txt','*.txt')) print(fnmatch('mark.txt','?ark.txt'))