Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1006666
  • 博文数量: 150
  • 博客积分: 3017
  • 博客等级: 少校
  • 技术积分: 3829
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-19 14:40
个人简介

Now in Baidu WISE team

文章分类

全部博文(150)

文章存档

2014年(8)

2013年(31)

2012年(111)

分类: C/C++

2012-12-27 14:44:26

假设模式串中包含"*"和"?", 判断给出的串是否和模式串匹配。
 
这个题是个表面容易的题,实际不不好做,没做过的话应该至少20分钟。
不可以简单的正向循环,否则类与abb与a*b的匹配就会出问题。
提供递归算法代码(codepad.org已验证)
非递归算法待补
 
算法描述:
定义如果匹配返回0,如果不匹配返回1.
用i表示当前处理的串下标,j表示当前处理的模式串的下标.
那么, 对于f(i,j)有
          f(i,j) = f(i-1,j-1) (src[i] == pattern[j] || pattern[j] == '?')
                   f(i-1,j)&f(i-1,j-1) (patter[j] == '*')
 

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. int test(const char* src, const char* pattern, int si, int pi){
  5.     if(src == NULL || pattern == NULL) return -1;
  6.     if(si<0&&pi<0) return 0;
  7.     if(si<0||pi<0) return 1;

  8.     if(pattern[pi] == '*'){
  9.         int movep = test(src, pattern, si-1, pi-1);
  10.         int nmovep = test(src, pattern, si-1,pi);
  11.         return movep&nmovep;
  12.     }
  13.     if(src[si] == pattern[pi] || pattern[pi] == '?'){
  14.         return test(src,pattern,si-1,pi-1);
  15.     }
  16.     return 1;
  17. }
  18. int main(){
  19.     char* src = "testthefunction";
  20.     char* pattern = "t*t?e*ion";
  21.     int ret = test(src, pattern, strlen(src)-1, strlen(pattern)-1);
  22.     printf("result = %d \n", ret);
  23. }

阅读(4328) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

k_lee95752015-06-24 03:24:23

首先谢谢楼主的代码,很棒!但是楼主有没有考虑通配符*代表NULL的情况?是不是还应该加上test(src, pattern, si,pi-1);的判断