剑指offer-正则表达式匹配

    xiaoxiao2023-10-14  148

    46.正则表达式匹配

    题目内容:

    代码及思路:

    诸如这道题,笔试的时候经常出现类似的字符串操作。

    首先来理解一下题目,以题目中的栗子为例:字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配

    原因是对于a.a,'.'可以表示任意一个字符,因此该处的'.'可以表示a;

    对于ab*ac*a,对于第一个'*'表示前一个数字即b可以出现任意次(包括0次)因此我们设定b出现0次,同理可得第二个位置处的'*'作用相同,c出现零次。因此这两个都与aaa匹配。

    而aa.a与ab*a同理可得就不能匹配了。

    #include<iostream> #include<string> using namespace std; class Solution { public: bool match(char* str, char* pattern) { //对无效输入进行判断 if (*str == '\0'&&*pattern == '\0') return true; if (*str != '\0'&&*pattern == '\0') return false; //对出现的正则情况进行分类 //如果下一个字符不为* if (*(pattern + 1) != '*') { //当前字符相等,或者str不为空,pattern该处是'.'。则继续下一位的判断 if (*str == *pattern || (*str != '\0'&&*pattern == '.')) return match(str + 1, pattern + 1); else // 否则则不匹配 return false; } else { //如果下一位是'*',则要判断当前位 if (*str == *pattern || (*str != '\0'&&*pattern == '.')) return match(str, pattern + 2)||match(str+1,pattern); else //当前位要是不等,则直接跳过pattern的两位 { return match(str, pattern + 2); } } } }; void main() { Solution* object = new Solution; string str1, pattern; getline(cin, str1); getline(cin, pattern); char* str = &str1[0]; char* pat = &pattern[0]; bool res = object->match(str, pat); cout << res << endl; }

     

    最新回复(0)