Given an input string (s) and a pattern (p), implement regular expression matching with support for '.' and '*'.


'.' Matches any single character.
'*' Matches zero or more of the preceding element.


The matching should cover the entire input string (not partial).

Note:


       s could be empty and contains only lowercase letters a-z.
       p could be empty and contains only lowercase letters a-z, and characters like . or *.


Example 1:


Input:
s = "aa"
p = "a"
Output: false
Explanation: "a" does not match the entire string "aa".


Example 2:


Input:
s = "aa"
p = "a*"
Output: true
Explanation: '*' means zero or more of the precedeng element, 'a'. Therefore, by repeating 'a' once, it becomes "aa".


Example 3:


Input:
s = "ab"
p = ".*"
Output: true
Explanation: ".*" means "zero or more (*) of any character (.)".


Example 4:


Input:
s = "aab"
p = "c*a*b"
Output: true
Explanation: c can be repeated 0 times, a can be repeated 1 time. Therefore it matches "aab".


Example 5:


Input:
s = "mississippi"
p = "mis*is*p*."
Output: false

```python

USER_FILENAME = "<user_code>"
import sys, json, builtins
import math, heapq, bisect, itertools, functools, collections, statistics, fractions, decimal, operator, array, random, re, string, os, pathlib
try:
    import resource as _res
except Exception:
    _res = None
from collections import Counter, defaultdict, deque, OrderedDict
from functools import lru_cache, reduce
from itertools import accumulate, permutations, combinations, product
from math import gcd, ceil, floor, sqrt
from decimal import Decimal
try:
    from typing import *
except Exception:
    pass
try:
    sys.setrecursionlimit(1_000_000)
except Exception:
    pass
try:
    import site as _site
    try:
        _sys_sites = _site.getsitepackages() if hasattr(_site, "getsitepackages") else []
        for _p in _sys_sites:
            if _p and _p not in sys.path:
                sys.path.append(_p)
    except Exception:
        pass
    try:
        _usp = _site.getusersitepackages()
        if isinstance(_usp, str):
            _usp = [_usp]
        for _p in _usp:
            if _p and _p not in sys.path:
                sys.path.append(_p)
    except Exception:
        pass
except Exception:
    pass

def _disabled_input(*args, **kwargs):
    raise RuntimeError("input() is disabled in callable mode")
builtins.input = _disabled_input

ns = {"__name__": "__judge__"}  # prevent if __name__ == "__main__" blocks
for _k, _v in list(globals().items()):
    if not _k.startswith("_"):
        ns[_k] = _v
_CODE = 'class Solution:\n     def isMatch(self, s, p):\n         """\n         :type s: str\n         :type p: str\n         :rtype: bool\n         """\n         def parsePatern(p):\n             pi=len(p)-1\n             while pi>=0:\n                 if p[pi]==\'*\':                    \n                     if pi==0: raise Exception(\'Invalid pattern!\')\n                     yield (p[pi-1], 1)\n                     pi-=2\n                 else:\n                     yield (p[pi], 0)\n                     pi-=1\n                     \n         from collections import deque\n         # p = b*bab*a*\n         # s = bbbba\n         if not p: return p==s\n         plist = list(parsePatern(p)) # [(\'a\', 1), (\'b\', 1), (\'a\', 0), (\'b\', 0), (\'b\', 1)]         \n         P = len(plist)\n         #q = deque([(0, len(s)-1)])\n         q = set([(0, len(s)-1)])\n         seen = set()\n         """\n         q = [ ((\'a\',1), 4) ]\n         q = [ ((\'b\',1), 4), ((\'b\',1), 3) ] \n         q = [ ((\'a\', 0), 4), ((\'a\',0), 3)), ((\'a\',0), 2), ((\'a\',0), 1), ((\'a\',0), 0), ((\'a\',0), -1)]\n         q = [ ((\'b\', 0), 3) ]\n         q = [ ((\'b\', 1), 2)]\n         q = [ ((\'\', 0), 2), ((\'\', 0), 1), ((\'\', 0), 0), ((\'\', 0), -1)]\n         ((\'\', 0), -1)-> true\n         \n         """\n         while q:\n             #print(q)\n             pat_i, si = q.pop()  \n             if (pat_i, si) in seen: \n                 #print(\'seen\')\n                 continue\n             \n             seen.add((pat_i, si))\n             pat, is_as = plist[pat_i] if pat_i<P else (\'\', 0)\n             """\n             1. a, 1\n                 1: bbbb\n                 0: bbbba\n             2. b, 1\n                 10: bbbb\n                 11: bbb\n                 12: bb\n                 13: b\n                 14: \'\'\n                 00: bbbba\n             3. a, 0\n                 001: bbbb\n             4. b, 0\n                 0011: bbb\n             5, b, 1:\n                 00110: bbb\n                 00111: bb\n                 00112: b\n                 00113: \'\'\n             6, \'\', 0\n                 00113 -> true\n             """\n             if not pat and si<0: return True                                    \n             if is_as:\n                 # match 0 -> n\n                 q.add((pat_i+1, si))\n                 #q.append((pat_i+1, si))\n                 #if (pat_i+1, si) in q: print(\'dup\', (pat_i+1, si))\n                 while si>=0 and (s[si]==pat or pat==\'.\'):\n                     si-=1\n                     #if (pat_i+1, si) in q: print(\'dup\', (pat_i+1, si))\n                     q.add((pat_i+1, si))\n                     #q.append((pat_i+1, si))\n             elif si>=0 and (s[si]==pat or pat==\'.\'):\n                 #if (pat_i+1, si-1) in q: print(\'dup\', (pat_i+1, si))\n                 q.add((pat_i+1, si-1))\n                 #q.append((pat_i+1, si-1))\n             \n         return False\n'
_co = compile(_CODE, USER_FILENAME, "exec")
exec(_co, ns, ns)

_target = None
_fn_name = 'isMatch'
if _fn_name:
    if "Solution" in ns:
        try:
            _obj = ns["Solution"]()
            if hasattr(_obj, _fn_name):
                _target = getattr(_obj, _fn_name)
        except Exception:
            _target = None
    if _target is None and _fn_name in ns and callable(ns[_fn_name]):
        _target = ns[_fn_name]
# Fallback: if there's exactly one user-defined function, use it
if _target is None:
    _cands = [v for k, v in ns.items() if callable(v) and getattr(v, "__module__", "") in ("__judge__", "__main__")]
    _user_funcs = [c for c in _cands if getattr(c, "__name__", "").startswith("_") is False]
    if len(_user_funcs) == 1:
        _target = _user_funcs[0]
if _target is None:
    raise RuntimeError(f"Could not resolve callable '{_fn_name}'")

_raw = sys.stdin.read().strip()
if _raw:
    _parsed = json.loads(_raw)
    if isinstance(_parsed, dict):
        _kwargs = _parsed.get("kwargs", {})
        _args = _parsed.get("args", [])
    else:
        _args, _kwargs = _parsed, {}
else:
    _args, _kwargs = [], {}
if not isinstance(_args, (list, tuple)):
    _args = [_args]
_res = _target(*_args, **_kwargs)
try:
    sys.stdout.write(repr(_res) + "\n")
except Exception:
    pass

```

Measured memory_bytes: 7346