美文网首页
leetcode-10-Regular Expression M

leetcode-10-Regular Expression M

作者: 帘外五更风 | 来源:发表于2020-01-31 10:37 被阅读0次
Regular Expression Matching

解法一:简单暴力求解

解题思路

  • 对模板字符串进行处理,分为四种情况:
    1)字母*
    2).*
    3)字母
    4).
  • 深度遍历求解

代码

class Solution {
public:
    typedef int MType;
    enum Roster{
        LetterAsterisk = 0,
        DotAsterisk,
        Letter,
        Dot
    };

    int model[101][2];

    int trans(string p) {
        int len = p.length();
        int index = 0;
        int pflag;
        for(int i = 0; i < len; i++) {
            if(p[i] == '*') continue;
            model[index][0] = int(p[i]);
            pflag = false;
            if(p[i] == '.') pflag = true;
            if(i+1 < len) {
                if(p[i+1] == '*') {
                    if(pflag) {
                        model[index][1] = DotAsterisk;
                    } else {
                        model[index][1] = LetterAsterisk;
                    }
                } else {
                    if(pflag) {
                        model[index][1] = Dot;
                    } else {
                        model[index][1] = Letter;
                    }
                }
            } else {
                if(pflag) {
                        model[index][1] = Dot;
                    } else {
                        model[index][1] = Letter;
                    }
            }
            index++;
        }
        return index;
    }

   bool dfs(int cur, string s, int pcur, int plen, int len) {
       if(cur == len) {
           for(int i = pcur; i < plen; i++) {
               if(model[i][1] == Dot || model[i][1] == Letter) return false;
           }
           return true;
       } 
       if(pcur >= plen) return false;
       switch (model[pcur][1]) {
           case LetterAsterisk:
                if(dfs(cur, s, pcur+1, plen, len) == true) return true;
                if(int(s[cur]) == model[pcur][0] && dfs(cur+1, s, pcur, plen, len) == true) return true;
                break;
           case DotAsterisk:
                if(dfs(cur, s, pcur+1, plen, len) == true) return true;  
                if(dfs(cur+1, s, pcur, plen, len) == true) return true;
                break;
           case Letter:
                if(int(s[cur]) == model[pcur][0] && dfs(cur+1, s, pcur+1, plen, len) == true) return true;  
                break;
           case Dot:
                if(dfs(cur+1, s, pcur+1, plen, len) == true) return true;
                break;

       }
       return false;
   }

    bool isMatch(string s, string p) {
        int lenOfP = trans(p);
        return dfs(0, s, 0, lenOfP, s.length());
    }
};

执行情况

此解法效率较低 执行结果

解法二:动态规划求解

解题思路

  • 对模板字符串进行处理,分为四种情况:
    1)字母*
    2).*
    3)字母
    4).
  • 动态规划求解:
    约定:input string (s) ,a pattern (p),处理后的模式串 model (m),字符串index(1~len)
    dp[i][j] : 表示s子串(1~i)与 m(1~j)的匹配情况

    递推式: 递推式

代码

class Solution {
public:
    typedef int MType;
    enum Roster{
        LetterAsterisk = 0,
        DotAsterisk,
        Letter,
        Dot
    };

    int model[101][2];

    int trans(string p) {
        int len = p.length();
        int index = 1;
        int pflag;
        for(int i = 0; i < len; i++) {
            if(p[i] == '*') continue;
            model[index][0] = int(p[i]);
            pflag = false;
            if(p[i] == '.') pflag = true;
            if(i+1 < len) {
                if(p[i+1] == '*') {
                    if(pflag) {
                        model[index][1] = DotAsterisk;
                    } else {
                        model[index][1] = LetterAsterisk;
                    }
                } else {
                    if(pflag) {
                        model[index][1] = Dot;
                    } else {
                        model[index][1] = Letter;
                    }
                }
            } else {
                if(pflag) {
                        model[index][1] = Dot;
                    } else {
                        model[index][1] = Letter;
                    }
            }
            index++;
        }
        return index-1;
    }

    bool isMatch(string s, string p) {
        int mlen = trans(p);
        int slen = s.length(); 
        bool dp[slen+1][mlen+1];

        for(int i = 0; i <= slen; i++) dp[i][0] = false;
        dp[0][0] = true;

        for(int i = 0; i <= slen; i++)
          for(int j = 1; j <= mlen; j++)
          {     
                dp[i][j] = false;  
                if(i > 0 && dp[i-1][j]) {
                    if((model[j][1] == LetterAsterisk && model[j][0] == int(s[i-1])) || model[j][1] == DotAsterisk) {
                        dp[i][j] = true;
                        continue;
                    }
                } 
                if(dp[i][j-1]) {
                    if((model[j][1] == LetterAsterisk) || model[j][1] == DotAsterisk) {
                        dp[i][j] = true;
                        continue;
                    }
                } 
                if(i > 0 && j > 0 && dp[i-1][j-1]) {
                    switch(model[j][1]){
                    case LetterAsterisk:
                    case Letter:
                        if(model[j][0] == int(s[i-1])) dp[i][j] = true;
                        break;
                    case DotAsterisk:
                    case Dot:
                        dp[i][j] = true;
                        break;
                }
             }
              
          }
          return dp[slen][mlen];
    }
};

执行情况

执行情况

相关文章

网友评论

      本文标题:leetcode-10-Regular Expression M

      本文链接:https://www.haomeiwen.com/subject/akxgthtx.html