zoukankan      html  css  js  c++  java
  • LeetCode OJ--Regular Expression Matching

    http://oj.leetcode.com/problems/regular-expression-matching/

    问题给想复杂了,只有p中可以含有. *,s中的字符都是确定的。想了好久,最终还是参考了网上的答案。等我再想想。

    #include <iostream>
    #include <map>
    #include <string>
    using namespace std;
    
    class Solution {
    public:
        bool isMatch(const char *s, const char *p) 
        {   
            if (s == NULL || p == NULL) return false;
            if (*p == '') return *s == '';
    
            if (*(p + 1) == '*')
            {
                while ((*s != '' && *p == '.') || *s == *p)
                {
                    if (isMatch(s, p + 2)) return true; //aab a*cd
                    ++s;
                }
    
                return isMatch(s, p + 2); //aab c*ab 的情况
            }
            else if ((*s != '' && *p == '.') || *s == *p)
            {
                return isMatch(s + 1, p + 1);
            }
    
            return false;
        }
    };
    
    int main()
    {
        Solution myS; 
        char *s = "aab";
        char *p = "a*cd";
        myS.isMatch(s,p);
        return 0;
    }

     于是,又试图用自己的解法,来做这道题。

    class Solution {
    public:
       bool isMatch(const char *s, const char *p) 
        {   
            if (s == NULL || p == NULL) return false;
            int j = 0,i = 0;
            char flagchar = '';
            while(s[i]!=''&&p[j]!='')
            {
                if(s[i] == p[j] ) 
                {
                    flagchar = s[i];
                    i++;
                    j++;
                }
                else if(p[j] == '.')
                {
                    i++;
                    j++;
                    flagchar = '';
                }
                else if(s[i]!= p[j] && p[j]!= '*' && p[j] != '' && p[j+1]!='' && p[j+1] == '*')
                {
                    flagchar = p[j];
                    j+= 2;
                }
                else if(p[j]=='*')
                {
                    if(flagchar == '')
                        flagchar = s[i];
                    while(p[j+1]!=''&&p[j+1]==flagchar) 
                        j++;
                    j++;
                    while(s[i]!=''&&s[i]==flagchar)
                        i++;
                }
                else
                    break;
            }
            if(s[i]==''&&p[j]=='')
                return true;
    
            return false;
        }
    };

    但是在"aaa", "ab*a*c*a"里,挂掉了。发现,当该边的只是规模的时候,确实递归非常好用。在这个地方,确实得递归。

    在多种情况匹配不确定的时候,这个尝试

    while ((*s != '' && *p == '.') || *s == *p)
    {
        if (isMatch(s, p + 2)) return true; //aab a*cd
             ++s;
    }
    return isMatch(s, p + 2); //aab c*ab 的情况

    这里,大赞啊!
    又长智商了。
  • 相关阅读:
    PHP操作Mysql
    python基础篇-爬虫urlparse使用及简单示例
    Mysql 返回JSON值属性的函数 (五)
    Mysql Json函数之更新 (四)
    Mysql Json函数之搜索 (三)
    Mysql Json函数创建 (二)
    Mysql Json函数总览 (一)
    Java8-Consumer、Supplier、Predicate和Function方法总结
    RPC原理及RPC实例分析(转)
    软件版本GA、Beta、RC含义
  • 原文地址:https://www.cnblogs.com/qingcheng/p/3509109.html
Copyright © 2011-2022 走看看