这道字符串匹配很精妙,第一次我做这个题用循环模拟,但是遇到*号时需要尝试所有的可能,故写不下去了,尝试使用递归解。
#include <stdio.h>
#include <windows.h>
bool matchCore(char*, char*);
bool match(char* str, char* pattern)
{
if (str == NULL || pattern == NULL) {
return 0;
}
return matchCore(str, pattern);
}
bool matchCore(char* str, char* pattern)
{
//仅有两个串同为\0才可能匹配成功
if (*str == '\0' && *pattern == '\0') {
return true;
}
//剪枝,可以不写
if (*str != '\0'&& *pattern == '\0') {
return false;
}
if (*(pattern + 1) == '*') {
if (*str == *pattern || (*pattern == '.' && *str != '\0')) {
//这里试探了三种可能,任一种匹配成功即成功
//匹配1次,不匹配,继续匹配
return matchCore(str + 1, pattern + 2) || matchCore(str, pattern + 2)\
|| matchCore(str + 1, pattern);
}
else {
return matchCore(str, pattern + 2);
}
}
if (*str == *pattern || (*pattern=='.' && *str!='\0')) {
return matchCore(str+1, pattern+1);
}
return false;
}
int main()
{
char str[10] = "aaa";
char pat[10] = "b*c*a*";
int ret = 0;
if (ret = match(str, pat)) {
printf("1");
}
system("pause");
}