Advertisement
kosievdmerwe

1202

Apr 26th, 2022
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.34 KB | None | 0 0
  1. class Solution:
  2.     def smallestStringWithSwaps(self, s: str, pairs: List[List[int]]) -> str:
  3.         N = len(s)
  4.        
  5.        
  6.         parents = [i for i in range(N)]
  7.         size = [1 for i in range(N)]
  8.        
  9.         def find(i: int) -> None:
  10.             root = i
  11.             while root != parents[root]:
  12.                 root = parents[root]
  13.            
  14.             while parents[i] != root:
  15.                 t = parents[i]
  16.                 parents[i] = root
  17.                 i = t
  18.            
  19.             return root
  20.            
  21.         def union(i: int, j: int) -> None:
  22.             i = find(i)
  23.             j = find(j)
  24.            
  25.             if i == j:
  26.                 return
  27.            
  28.             if size[i] < size[j]:
  29.                 j, i = i, j
  30.            
  31.             parents[j] = i
  32.             size[i] += size[j]
  33.            
  34.         for i, j in pairs:
  35.             union(i, j)
  36.        
  37.         letter_sets = defaultdict(set)
  38.         for i in range(N):
  39.             p = find(i)
  40.             letter_sets[p].add(i)
  41.        
  42.         ans = list(s)
  43.         for letter_set in letter_sets.values():
  44.             letters = [s[i] for i in letter_set]
  45.             letters.sort()
  46.             for idx, i in enumerate(sorted(letter_set)):
  47.                 ans[i] = letters[idx]
  48.            
  49.         return "".join(ans)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement