Chinaunix首页 | 论坛 | 博客
  • 博客访问: 68446
  • 博文数量: 115
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-08 19:09
文章分类
文章存档

2015年(115)

我的朋友

分类: C/C++

2015-08-06 16:44:31

假设模式串中包含"*"和"?", 判断给出的串是否和模式串匹配。
 
这个题是个表面容易的题,实际不不好做,没做过的话应该至少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. }

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