1+ def solution (user_id , banned_id ):
2+ # [j_idx, current]
3+ answer = set ()
4+ lenU , lenB = len (user_id ), len (banned_id )
5+ stack = [[0 , [], [0 ] * lenU , [0 ] * lenB ]]
6+
7+ while stack :
8+ j_idx , current , uvisited , bvisited = stack .pop ()
9+ if len (set (current )) == len (banned_id ):
10+ answer .add (tuple (sorted (current )))
11+ continue
12+
13+ for i in range (lenU ):
14+ for j in range (j_idx , lenB ):
15+ if not uvisited [i ] and not bvisited [j ]:
16+ condition1 = len (user_id [i ]) == len (banned_id [j ])
17+ condition2 = True
18+ for a , b in zip (user_id [i ], banned_id [j ]):
19+ if b != '*' and a != b :
20+ condition2 = False
21+ break
22+ if condition1 and condition2 :
23+ new_uvisited = uvisited [:]
24+ new_bvisited = bvisited [:]
25+ new_bvisited [j ] = new_uvisited [i ] = True
26+ new_stack = current [:]
27+ new_stack .append (user_id [i ])
28+ stack .append ([j + 1 , new_stack , new_uvisited , new_bvisited ])
29+ #print(answer)
30+ return len (answer )
31+
32+
33+ def is_match (user_id , banned_id ):
34+ if len (user_id ) != len (banned_id ):
35+ return False
36+ for u , b in zip (user_id , banned_id ):
37+ if b != '*' and u != b :
38+ return False
39+ return True
40+
41+ def count_unique_combinations (user_id , banned_id , idx , used , used_banned , result , results ):
42+ if idx == len (banned_id ):
43+ results .add (tuple (sorted (result )))
44+ return
45+
46+ for i , user in enumerate (user_id ):
47+ if not used [i ] and is_match (user , banned_id [idx ]):
48+ used [i ] = True
49+ result .append (user )
50+ count_unique_combinations (user_id , banned_id , idx + 1 , used , used_banned , result , results )
51+ result .pop ()
52+ used [i ] = False
53+
54+ def solution (user_id , banned_id ):
55+ results = set ()
56+ count_unique_combinations (user_id , banned_id , 0 , [False ] * len (user_id ), [False ] * len (banned_id ), [], results )
57+ return len (results )
0 commit comments