失败的尝试 10. regular expression matching & 正则

Posted warcraft

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了失败的尝试 10. regular expression matching & 正则相关的知识,希望对你有一定的参考价值。

Regular Expression Matching

看到正则就感觉头大,因为正则用好了就很强大。有挑战的才有意思。

其实没有一点思路。循环的话,不能一一对比,匹配模式解释的是之前的字符。那就先遍历模式把。

... 中间 n 次失败的提交

感觉代码逻辑很乱。重新捋一下再动手写。
找几个重点分析一下:

Wrong Answer:

Input:
"aaa"
"ab*a*c*a"
Output:
false
Expected:
true

调试

aaa ab*a*c*a
0 a a s
1 a b n
1 a * * b
1 a a s
2 a * * a
prev char eq
False

分析,aaa字符串s中s[1]的a被模式p[3]中的a匹配了,然后s[2]的a被p[4]的*匹配了。还是没有解决*匹配0次的问题,那就得预先判断后面是啥模式而不是在之后判断前面的一个模式是啥。

N小时后来更,改了好多次没有解决匹配0-多次字符之后还有该字符。
可能我钻牛角尖了,删掉重新想一种思路。

... 又 n 次失败的本地测试
failed submission
import time

class Solution:
    def __init__(self):
        self.any=‘.‘ # any character
        self.zom=‘*‘ # zero or more
    def isMatch(self, s, p):
        """
        :type s: str
        :type p: str
        :rtype: bool
        """
        ci=0

        prevPattern=None

        for pi,pa in enumerate(p):
            if ci==len(s):
                if len(s)==0:
                    continue
                
                if ci>0 and prevPattern==self.zom:
                    ci-=1
                else:
                    break
                print("other:",pa)
                #continue
            while ci < len(s):
                ci+=1
                print(pi,pa,ci-1,s[ci-1],end="| ")
                if pa==self.any:
                    print(‘.‘)
                    break
                elif pa==self.zom:
                    print(‘*‘,prevPattern)
                    if prevPattern==self.any:
                        continue
                    elif prevPattern==s[ci-1]:
                        continue
                    else:
                        # no match, end processing 
                        pass
                        #prevPattern=‘‘
                        ci-=1
                        break
                    break
                elif pa==s[ci-1]:
                    # same character
                    print(‘s‘)
                    break
                else:
                    print(‘n‘)
                    ci-=1
                    break
            prevPattern=pa
        else:
            return ci==len(s)

        return False


if __name__ == "__main__":
    
    data = [
        {
            "input":{‘s‘:‘aa‘,‘p‘:‘a‘},
            "output":False, 
        },
        {
            "input":{‘s‘:‘aa‘,‘p‘:‘a*‘},
            "output":True, 
        },
        {
            "input":{‘s‘:‘ab‘,‘p‘:‘.*‘},
            "output":True, 
        },
        {
            "input":{‘s‘:‘aab‘,‘p‘:‘c*a*b‘},
            "output":True, 
        },
        {
            "input":{‘s‘:‘mississippi‘,‘p‘:‘mis*is*p*.‘},
            "output":False, 
        },
        {
            "input":{‘s‘:‘aaa‘,‘p‘:‘ab*a*c*a‘},
            "output":True, 
        },
        {
            "input":{‘s‘:‘ab‘,‘p‘:‘.*c‘},
            "output":False, 
        },
        {
            "input":{‘s‘:‘axb‘,‘p‘:‘a.b‘},
            "output":True, 
        },
        {
            "input":{‘s‘:‘mississippi‘,‘p‘:‘mis*is*ip*.‘},
            "output":True, 
        },
        {
            "input":{‘s‘:‘aaa‘,‘p‘:‘a*a‘},
            "output":True, 
        },
        {
            "input":{‘s‘:‘‘,‘p‘:‘.*‘},
            "output":True, 
        },
        {
            "input":{‘s‘:‘aaa‘,‘p‘:‘aaaa‘},
            "output":False, 
        },
        {
            "input":{‘s‘:‘a‘,‘p‘:‘ab*‘},
            "output":True, 
        }
    ];
    for d in data:
        
        print(d[‘input‘][‘s‘],d[‘input‘][‘p‘])
        
        # 计算运行时间
        start = time.perf_counter()
        result=Solution().isMatch(d[‘input‘][‘s‘],d[‘input‘][‘p‘])
        end = time.perf_counter()
        
        print(result)
        if result==d[‘output‘]:
            print("--- ok ---",end="	")
        else:
            raise Exception
        
        print(start-end)

不行,今天大半天都浪费到这上面了,怀疑人生。

去搜索一下,发现:

总结:想法本来就没有成熟,之前的题目都是一些常规的,这个正则不研究没有理论支撑可不好用。
等日后再战




以上是关于失败的尝试 10. regular expression matching & 正则的主要内容,如果未能解决你的问题,请参考以下文章

leetcode 10 Regular Expression Matching

10. Regular Expression Matching

E35:No previous regular expression的翻译是:啥意思

10. Regular Expression Matching

10. Regular Expression Matching

10. Regular Expression Matching