题目描述:
请实现一个函数用来匹配包括‘.‘和‘*‘的正则表达式。模式中的字符‘.‘表示任意一个字符,而‘*‘表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
思路分析:
这里要注意审题,一开始看的时候以为是两个模式串的匹配。后来发现一个就是普通的字符串,而另一个才是所谓的模式串,即包含了‘.‘和‘*‘。
这类题目需要考虑的比较全面,对各个情况进行分析,并没有太多的技巧点和算法在其中,用到的就是递归。具体的解析在注释当中有进行说明。
代码:
1 class Solution { 2 public: 3 bool match(char* str, char* pattern) 4 { 5 // 若为空指针,则返回false 6 if(str==nullptr || pattern==nullptr) 7 return false; 8 return matchCore(str, pattern); 9 } 10 11 private: 12 bool matchCore(char* str, char* pattern) 13 { 14 // 若都走到结尾,则返回true 15 if(*str==‘\0‘ && *pattern==‘\0‘) 16 return true; 17 // 字符串没到结尾,而模式串到了,则返回false 18 if(*str!=‘\0‘ && *pattern==‘\0‘) 19 return false; 20 // 字符串到了结尾,而模式串没到,则需要继续判断,对后续‘*‘做处理 21 if(*(pattern+1)==‘*‘) 22 { 23 // 若当前字符串与模式串匹配或模式串为‘.‘且字符串不到结尾 24 if(*str==*pattern || (*pattern==‘.‘ && *str!=‘\0‘)) 25 { 26 // 只匹配当前的这个字符后,跳过模式串的‘*‘ 27 return matchCore(str+1, pattern+2) || 28 // 继续对后续的字符匹配‘*‘ 29 matchCore(str+1, pattern) || 30 // 当前字符也不对‘*‘匹配,跳过这个模式 31 matchCore(str, pattern+2); 32 } 33 // 否则,当前的字符与模式不匹配,则跳过‘*‘这个模式 34 else 35 { 36 return matchCore(str, pattern+2); 37 } 38 } 39 // 当前的模式串没有‘*‘,则需要判断模式串和字符串是否相等,或判断模式串为‘.‘且字符串不到末尾 40 if(*str==*pattern || (*pattern==‘.‘ && *str!=‘\0‘)) 41 { 42 return matchCore(str+1, pattern+1); 43 } 44 return false; 45 } 46 };
原文:https://www.cnblogs.com/LJ-LJ/p/11100371.html