HDU2585

来源:互联网 发布:360.cn 域名价格 编辑:程序博客网 时间:2024/05/01 12:19

Problem: Hotel
Description: 一个人住酒店。但是他忘记门牌号码了,现在给出一个他模糊记得的门牌号字符串,这个字符串包含‘* ’,‘?’,‘a-z’。‘* ’表示零个或多个字符,而‘?’表示一个任意的字母。现在给出多个候选项,让你找出有几个符合这个人的门牌号的。
Solution: 递归。我们抓住‘* ’这个字符。这个字符可以让我们得出一个比原问题更小的解结构。比如我们比较“* hh”和“flushhip”,遇到‘* ’我们就比较星号后的‘hh’和“flushhip”、“lushhip”、“ushhip”、“shhip”、“hhip”等等。递归结束的条件是当模式串走到尽头。
Code(C++):

#include <stdio.h>#include <string.h>const int M=55;char tag[M];char str[M];int flag_len;bool work(int start_tag,int start_str,int len){    if(start_tag==flag_len&&start_str==len)        return true;    switch(tag[start_tag]){    case '*':        if(start_tag+1==flag_len)            return true;        for(int i=start_str;i<len;i++)            if(work(start_tag+1,i,len))                return true;        return false;    case '?':        return work(start_tag+1,start_str+1,len);    default:        return tag[start_tag]==str[start_str]? work(start_tag+1,start_str+1,len):false;    }}int main(){    while(~scanf("%s",tag)){        flag_len=strlen(tag);        int n;        int ans=0;        for(scanf("%d",&n);n--;){            scanf("%s",str);            ans+=work(0,0,strlen(str))? 1:0;        }        printf("%d\n",ans);    }    return 0;}
0 0