1. 程式人生 > >算法題:判斷正則表達式的.和*的模式匹配

算法題:判斷正則表達式的.和*的模式匹配

bool include public title turn ret att 匹配模式 判斷

題目描述

請實現一個函數用來匹配包括‘.‘和‘*‘的正則表達式。模式中的字符‘.‘表示任意一個字符,而‘*‘表示它前面的字符可以出現任意次(包含0次)。 在本題中,匹配是指字符串的所有字符匹配整個模式。例如,字符串"aaa"與模式"a.a"和"ab*ac*a"匹配,但是與"aa.a"和"ab*a"均不匹配
思路描述
1、字符串和匹配模式都為空,返回true;否則遞歸,進入2; 22.1 若第二個字符為‘*‘,且第一個字符相同,或者匹配模式第一個字符為‘.‘,否則進入2.2:     2.1.1 若‘*‘不代表>1,字符串後移1位,匹配字符串不變,繼續2.1.1;若‘*‘表示1,轉入2.1.2。
    2.1.2 若‘*‘表示1,字符串後移1位,匹配字符串後移2位。     2.1.3 若’*‘表示0,字符串不變,匹配字符後移2位。     用或連接,只要其中一個為true即可。 2.2 ‘*‘表示為0,和上面的差別是,這裏第一個字符不相等,匹配模式第一個字符不為‘.‘。 33.1 若第二個字符不為‘*‘:     3.1.1 若第一個字符為‘.‘,字符串後移1位,匹配字符串後移1位。     3.1.1 若第一個字符不為‘.‘,比較,相等,字符串後移1位,匹配字符串後移1位;不想等,返回false
代碼實現:
#include<iostream>
#include
<string> using namespace std; class Solution { public: bool match(char* str, char* pattern){ if (str==nullptr && pattern==nullptr) return false; return step(str,pattern); } bool step(char* str, char* pattern){ if(*str==\0&&*pattern==\0)//同時結束
return true; if(*str!=\0&&*pattern==\0) return false; if(*(pattern+1)==*) if(*pattern==*str||(*pattern==.&&*str!=\0)) return step(str+1,pattern)/*1、*取>=2的情況 */||step(str+1,pattern+2)/* 2、*取1的情況 */||step(str,pattern+2);//3、*取0的情況 else return step(str,pattern+2);//字符串與匹配模式第一個字符不相同*取0的情況 if(*str==*pattern||(*pattern==.&&*str!=\0)) return step(str+1,pattern+1);//存在.或者兩個字符一樣 return false; } };

算法題:判斷正則表達式的.和*的模式匹配