BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #32011同步于 2009/11/24
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

一道字符串匹配题目,有兴趣的进来。

camelBUPT
2009/11/24镜像同步11 回复
字符串1:只含有英文字母, 字符串2:含有英文字母和*,其中符号*表示匹配任意字符0或者多次,即正则表达式里面的含义。 现在给定这样的两个串,要求判断是否匹配? bool isMatch ( const char *str1, const char *str2) 例如:str1 = "hello", str2 = "he*o",则二者匹配,返回true, str1 = "hello", str2 = "he*l",则不匹配,返回false。
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
sunway机器人#1 · 2009/11/24
既然是正则表达式,就可以用自动机解决吧 【 在 camelBUPT (迷茫的人) 的大作中提到: 】 : 字符串1:只含有英文字母, : 字符串2:含有英文字母和*,其中符号*表示匹配任意字符0或者多次,即正则表达式里面的含义。 : 现在给定这样的两个串,要求判断是否匹配? : ...................
jokerlee机器人#2 · 2009/11/24
这个回溯一下就OK了
camelBUPT机器人#3 · 2009/11/24
能说详细点吗? 谢谢! 【 在 jokerlee 的大作中提到: 】 : 这个回溯一下就OK了
jokerlee机器人#4 · 2009/11/24
当*t不是*的时候, 就像普通的串匹配一样, 移动s和t 当*t是*的时候, 假设*t后面第一个不是*的字符是x, 若x是null, 直接匹配成功, 否则在s中找到当前位置后所有字符x的位置, 这时候问题转化成了t中x后的串和s中当前位置以后所有以x为开始的串的匹配问题, 递归调用即可, 其中任意一个匹配成功, 则原串匹配成功, 若都没有匹配成功则匹配失败. 当*s和*t其中一个是null时 跳出循环, 若此时 *t == '*', 则++t 直到 t != '*', 这时若 *t == 0 则代表匹配成功, 否则匹配失败 稍微调试了一下,不知道还有没有错误 #include <cstring> #include <iostream> using namespace std; bool is_match(const char * s, const char * t) { while (*s && *t) { if (*t != '*' && *s == *t) ++s, ++t; else if (*t != '*' && *s != *t) return false; else if (*t == '*') { do ++t; while (*t == '*'); if (*t == 0) return true; for ( ; *s; ++s) if (*s == *t && is_match(s+1, t+1)) return true; return false; } } while (*t == '*') ++t; if (*s == *t) return true; else return false } int main(int argc, char * argv[]) { if (is_match(argv[1], argv[2])) cout << "match" << endl; else cout << "not match" << endl; return 0; }
bingshan0424机器人#5 · 2009/11/25
赞上楼
camelBUPT机器人#6 · 2009/11/25
非常棒,谢谢!!! 【 在 jokerlee 的大作中提到: 】 : 当*t不是*的时候, 就像普通的串匹配一样, 移动s和t : 当*t是*的时候, 假设*t后面第一个不是*的字符是x, 若x是null, 直接匹配成功, 否则在s中找到当前位置后所有字符x的位置, 这时候问题转化成了t中x后的串和s中当前位置以后所有以x为开始的串的匹配问题, 递归调用即可, 其中任意一个匹配成功, 则原串匹配成功, 若都没有匹配成功则匹配失败. : 当*s和*t其中一个是null时 跳出循环, 若此时 *t == '*', 则++t 直到 t != '*', 这时若 *t == 0 则代表匹配成功, 否则匹配失败 : ...................
xieys机器人#7 · 2009/11/25
我也这么认为 【 在 sunway 的大作中提到: 】 : 既然是正则表达式,就可以用自动机解决吧
allenbo机器人#8 · 2009/11/25
强!!
xieys机器人#9 · 2009/11/25
加上记忆化递归效率就会高一些 【 在 jokerlee 的大作中提到: 】 : 当*t不是*的时候, 就像普通的串匹配一样, 移动s和t : 当*t是*的时候, 假设*t后面第一个不是*的字符是x, 若x是null, 直接匹配成功, 否则在s中找到当前位置后所有字符x的位置, 这时候问题转化成了t中x后的串和s中当前位置以后所有以x为开始的串的匹配问题, 递归调用即可, 其中任意一个匹配成功, 则原串匹配成功, 若都没有匹配成功则匹配失败. : 当*s和*t其中一个是null时 跳出循环, 若此时 *t == '*', 则++t 直到 t != '*', 这时若 *t == 0 则代表匹配成功, 否则匹配失败 : ...................