• + 0 comments

    def _check(a, b): print(a, b) dp=[[ False for _ in range(len(a)+1) ] for _ in range(len(b)+1)] dp[0][0]=True for j in range(1, len(a)+1): if a[j-1].islower() and dp[0][j-1]: dp[0][j]=True else: break for i in range(1, len(b)+1): for j in range(1, len(a)+1): if a[j-1]==b[i-1]: dp[i][j]=dp[i-1][j-1] elif a[j-1].upper()==b[i-1]: dp[i][j]=dp[i-1][j-1] or dp[i][j-1] elif a[j-1].islower(): dp[i][j]=dp[i][j-1]

    return dp[-1][-1]
    

    def _remove_unused(a, b): _set_b=set(b) return "".join(list([x for x in a if x.isupper() or x.upper() in _set_b]))

    def _build_dp(a): _dp = collections.defaultdict(int) for _, x in enumerate(a): _dp[x.upper()]+=1 return _dp

    def _precheck_check_dp(dp_a, dp_b): for x in dp_b: if dp_a[x] < dp_b[x]: return False return True

    def abbreviation(a, b): a=_remove_unused(a, b) if len(a) if not _precheck_check_dp(_build_dp(a),_build_dp(b)): return "NO" if _check(a, b): return "YES" else: return "NO"