24小时热门版块排行榜    

查看: 1865  |  回复: 16
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

460104898

铜虫 (正式写手)

[交流] 一个华为编程大赛题 已有3人参与

判断包含通配符的匹配字符串是否完全匹配输入的字符串。
匹配字符串中包含的通配符仅有“*”和“?”,且通配符不会
连续出现。(要求完全匹配而不是包含)

蛮有意思的,大家可以编编。。
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

huycwork

金虫 (著名写手)

★ ★ ★ ★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
dubo(金币+1): 谢谢交流 2011-05-29 21:43:22
微尘、梦想(金币+4): 谢谢参与! 2011-05-30 17:55:00
俺来个递归各种复杂版,不确定的状态机真是麻烦透了。免分析,直接上代码,C++版本:
CODE:
#include
#include
using namespace std;
/*
* 参数说明
* str为待匹配字符串
* reg为通配符表达式
* is为str的当前索引,即从第is个字符开始匹配
* ir为reg的当前索引,即从第ir个字符开始匹配
*/
bool reg_match(const string &str, const string ®, size_t is = 0, size_t ir = 0){
        if(ir == reg.size() - 1){
                //*是贪婪的,以*结尾的任何表达式都表示匹配
                if(reg.back() == '*')
                        return true;
                //以?结尾的reg遇到字符串结尾也表示匹配
                if((reg.back() == '?')&&(is == str.size()-1))
                        return true;
                //reg和str的尾字符匹配
                if(is == str.size() - 1)
                        return str.back() == reg.back();
        }
        bool res = false;
        char flagc;
        for(size_t i = is; i < str.size(); ++i){
                switch(reg.at(ir)){
                case '*':
                        //设置标志,*后面的第一个标志定位什么时候开始下一层匹配
                        if(reg.at(ir+1) == '?'){
                                if(reg.size() == ir+2)
                                        return true;
                                flagc = reg.at(ir+2);
                        }else{
                                flagc = reg.at(ir+1);
                        }
                        //贪婪匹配,吃掉遇到flag之前的任何操作符之后匹配下一层
                        for(size_t rsi = str.size() - 1; rsi >= is; --rsi){
                                if(str.at(rsi) == flagc){
                                        if(reg_match(str, reg, rsi, ir+1))
                                                return true;
                                }
                        }
                        return false;
                case '?':
                        //0匹配和1匹配,优先1匹配
                        if(reg_match(str, reg, is+1, ir+1))
                                return true;
                        return reg_match(str, reg, is, ir+1);
                default:
                        //其余字符取相等匹配
                        if(str.at(is) == reg.at(ir))
                                return reg_match(str, reg, is+1, ir+1);
                        return false;
                }
        }
        return false;     //免编译错误,应排版需要的尾巴
}

int main(){
        using namespace std;
        string str("ababacdbadcbaecdef");
        string reg("ab*c*a?e*f");
        cout<         return 0;
}

说明:
*为贪婪符号,?也是贪婪的,这就是说,*.txt会完整匹配abc.txt.txt,?c会优先匹配ac而不是c。
意思就大概是这个意思了,根据给出的通配表达式,对应到正则表达式,如:
ab*c*a?e*f => ab.*c.*a.?e.*f

欢迎指点讨论。

[ Last edited by huycwork on 2011-5-29 at 21:57 ]
漩涡的中心有一块空地,空空的。
11楼2011-05-29 21:35:14
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 17 个回答

微尘、梦想

木虫 (知名作家)


小木虫(金币+0.5):给个红包,谢谢回帖
看得不太懂,是不是匹配字符串是已知的,然后看看手工输入的字符串是不是和它一样啊?
任风云变幻,我笑对人生!
2楼2011-05-29 18:10:26
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

460104898

铜虫 (正式写手)

引用回帖:
Originally posted by 微尘、梦想 at 2011-05-29 18:10:26:
看得不太懂,是不是匹配字符串是已知的,然后看看手工输入的字符串是不是和它一样啊?

恩 。
只是输入的字符串可以有通配符。
3楼2011-05-29 18:42:02
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

微尘、梦想

木虫 (知名作家)


小木虫(金币+0.5):给个红包,谢谢回帖
CODE:
#include
void main(void)
{
        char *p="l*l?l?l*";
        char a[10];
        gets(a);
        if(strcmp(p,a)==0)
                printf("完全匹配!\n");
        else printf("不完全匹配!\n");

}

不知道是不是这个意思?如果仅仅是这样的话,好像没什么呀!
任风云变幻,我笑对人生!
4楼2011-05-29 18:59:10
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
普通表情 高级回复 (可上传附件)
信息提示
请填处理意见