zoukankan      html  css  js  c++  java
  • (剑指Offer)面试题53:正则表达式匹配

    题目:

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

    思路:

    假设字符串为str,模式串为pattern,考虑以下情况:

    A. 模式串下一个字符为*,即*(pattern+1)=='*':

    如果当前字符匹配,即*str=*pattern或者*str='.' && *pattern!='',三种可能:

     1、模式串当前字符出现0次,即*表示当前字符出现0次,则str=str,pattern=pattern+2;

     2、模式串当前字符出现1次,即*表示当前字符出现1次,则str=str+1,pattern=pattern+2;

     3、模式串当前字符出现2次或2次以上,即*表示当前字符出现2次或以上,则str=str+1,pattern=pattern;

    如果当前字符不匹配,则只能让*表示当前字符出现0次,则str=str,pattern=pattern+2;

    B. 模式串下一个字符不为*

    如果当前字符匹配,即*str=*pattern或者*str='.' && *pattern!='',则str=str+1,pattern=pattern+1.

    代码:

    #include <iostream>
    
    using namespace std;
    
    bool RegMatchCore(const char* str, const char* pattern){
        if(*str=='' && *pattern=='')
            return true;
        if(*str!='' && *pattern=='')
            return false;
    
        if(*(pattern+1)=='*'){
            if(*str==*pattern || (*str!='' && *pattern=='.'))
                return RegMatchCore(str,pattern+2) || RegMatchCore(str+1,pattern+2) || RegMatchCore(str+1,pattern);
            else
                // ignore *
                return RegMatchCore(str,pattern+2);
        }
    
        if(*str==*pattern || (*str!='' && *pattern=='.'))
            return RegMatchCore(str+1,pattern+1);
    
        return false;
    }
    
    
    bool RegMatch(const char* str, const char* pattern){
        if(str==NULL || pattern==NULL)
            return false;
        return RegMatchCore(str,pattern);
    }
    
    
    int main()
    {
        char str[] = "aaa";
        char pattern1[]="ab*ac*a";
        char pattern2[]="ab*a";
        cout << RegMatch(str,pattern1) << endl;
        cout << RegMatch(str,pattern2) << endl;
        return 0;
    }

    在线测试OJ:

    http://www.nowcoder.com/books/coding-interviews/45327ae22b7b413ea21df13ee7d6429c?rp=3

    AC代码:

    class Solution {
    public:
        bool match(char* str, char* pattern)
        {
        	if(str==NULL || pattern==NULL)
                return false;
            return matchCore(str,pattern); 
        }
        
        bool matchCore(const char* str,const char* pattern){
        	if(*str=='' && *pattern=='')
                return true;
            if(*str!='' && *pattern=='')
                return false;
            
            if(*(pattern+1)=='*'){
                if(*str==*pattern || (*str!='' && *pattern=='.'))
                    return matchCore(str,pattern+2)||matchCore(str+1,pattern+2)||matchCore(str+1,pattern);
                else
                    return matchCore(str,pattern+2);
            }
            
            if(*str==*pattern || (*str!='' && *pattern=='.'))
                return matchCore(str+1,pattern+1);
            
            return false;
        }
    };
  • 相关阅读:
    鼠标移入图片放大效果
    搜索框
    将下拉菜单放入input框中
    轮播图2
    V-demo item.vue
    v-demo1 List.vue
    v-demo1 add.vue
    v-demo1 app.vue
    3D轮播图
    封装代码
  • 原文地址:https://www.cnblogs.com/AndyJee/p/4700373.html
Copyright © 2011-2022 走看看