正则表达式匹配

    科技2022-07-14  117

    1、题目

    请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配

    2、解题1

    按照是否相等进行判断分类

    class Solution { public: bool match(char* str, char* pattern) { if(str == NULL || pattern == NULL)return false; char one = '\0'; bool flag = JudgeMatch(str,pattern,one,0); return flag; } bool JudgeMatch(char* str,char* pattern,char one,int pos){ if(pos < 0)return false; if(*str == '\0' && *pattern == '\0')return true; if(*pattern == '\0')return false; if(*str == '\0'){ //不回退的情况 bool flag = true; bool has = false; if(*pattern != '*'){ pattern++; }else{ has = true; } if(*pattern != '*')flag = false; while(*pattern != '\0' && *pattern == '*')pattern++; if(*pattern != '\0'){ if(flag == true){ flag = false; } } if(flag == true)return true; if(has == false)return false; //回退的情况 char tmp = '\0'; return JudgeMatch(str-1,pattern,tmp,pos-1); } //不等情况 if(*pattern != *str){ //都是字母的情况 if(*pattern != '.' && *pattern != '*'){ char *tmpLast = pattern+1; //后面没有*情况 if(*tmpLast != '*')return false; char tmp = '\0'; return JudgeMatch(str,tmpLast+1,tmp,pos); } if(*pattern == '.'){ char tmp = *pattern; return JudgeMatch(str+1,pattern+1,tmp,pos+1); } //处理pattern带*的情况,不等的情况 if(one != '.' && one != *str){ char tmp = '\0'; return JudgeMatch(str,pattern+1,tmp,pos); } //处理相等的情况 //1,*代表多个字符 bool flag = JudgeMatch(str+1,pattern,one,pos); //2,*代表1个字符 if(flag == false){ char tmp = '\0'; char *tmpPattern = pattern; while(*tmpPattern != '\0' && *tmpPattern == '*')tmpPattern++; flag = JudgeMatch(str,tmpPattern,tmp,pos); } //3,*代表0个字符 if(flag == false){ char tmp = '\0'; char *tmpPattern = pattern; while(*tmpPattern != '\0' && *tmpPattern == '*')tmpPattern++; flag = JudgeMatch(str-1,tmpPattern,tmp,pos-1); } return flag; }else{ //相等的情况 char tmp = *pattern; return JudgeMatch(str+1,pattern+1,tmp,pos+1); } } };

    3、解题2(简化)

    按照是否有*进行判断分类

    class Solution { public: bool match(char* str, char* pattern) { if(str == NULL || pattern == NULL)return false; bool flag = JudgeMatch(str,pattern); return flag; } bool JudgeMatch(char* str,char* pattern){ if(*str == '\0' && *pattern == '\0')return true; if(*pattern == '\0')return false; if(*(pattern+1) == '*'){ if(*pattern == *str || (*str != '\0' && *pattern == '.')){ return JudgeMatch(str+1,pattern) || JudgeMatch(str,pattern+2);; }else{ return JudgeMatch(str,pattern+2); } }else{ //相等的情况 if(*pattern == *str || (*str != '\0' && *pattern == '.')){ return JudgeMatch(str+1,pattern+1); }else{ //不等的情况 return false; } } } };
    Processed: 0.015, SQL: 8