带有通配符的字符串匹配算法-C/C++
来源:互联网 发布:知乎新西兰玉石 编辑:程序博客网 时间:2024/05/17 04:05
转自:http://blog.chinaunix.net/uid-20682147-id-76416.html
日前某君给我出了这样一道题目:两个字符串,一个是普通字符串,另一个含有*和?通配符,*代表零个到多个任意字符,?代表一个任意字符,通配符可能多次出现。写一个算法,比较两个字符串是否相等。 我花了四个小时写出两种算法来解决这个问题,简单地测试了一下,好使!
//方法一,从无通配符到有?再到有*,逐步推进分析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]; }
- 带有通配符的字符串匹配算法-C/C++
- 带有通配符的字符串匹配算法-C/C++
- 带有通配符的两个字符串匹配问题
- C语言通配符匹配、文件名通配符匹配算法(wildchar.c)
- 字符串通配符的匹配算法
- 通配符的字符串匹配算法
- 通配符的字符串匹配算法
- 带有通配符的字符串和另一个字符串进行匹配
- 带有通配符的字符串和另一个字符串进行匹配
- C语言实现的带通配符的字符串匹配
- 字符串匹配算法,包含通配符"*"、"?"的匹配
- rock c语言实现的带通配符匹配算法
- 动态规划 | 带有通配符的字符串匹配(浅显易懂)
- 动态规划 | 带有通配符的字符串匹配(浅显易懂)
- 文件通配符匹配检测C算法实现
- 字符串通配符匹配*,?算法
- 含有通配符的字符串匹配算法
- 含有通配符?和*的字符串匹配算法
- 可信计算的研究与发展
- 类的继承和派生
- 动态分配二维数组
- JAVA的JDK安装并在DOS下的运行项目
- linux errno 定义
- 带有通配符的字符串匹配算法-C/C++
- 1.5.1---Number Triangles
- LVN_ITEMCHANGED通知会响应多次的问题
- 《Algorithms 》书评《大家好,我是译者 》
- 从通用的arraylist中删除项目元素
- 《新概念》英语的学习方法(完整版)
- poj1062-子图dijkstra单源最短路径问题
- excel 比对字符
- 大数据的处理