leetcode_1202. 문자열 의 요 소 를 교환 합 니 다.

목차
제목
2. 문제 풀이 사고
코드
제목
문자열 하나 드릴 게 요. s, 그리고 이 문자열 의 '색인 쌍' 배열 pairs, 그 중 pairs[i] = [a, b] 문자열 의 두 색인 을 표시 합 니 다.
너 는 임의로 여러 번 교환 할 수 있다. pairs 색인 에 있 는 임의의 문자 입 니 다.
몇 번 의 교환 을 거 친 후, s 로 되 돌아 갑 니 다. 사전 순서에 따라 가장 작은 문자열 로 변 할 수 있 습 니 다.
예시 1:
입력: s = "dcab", pairs = [0, 3], [1, 2] 출력: "bacd" 설명:  교환 s [0] 와 s [3], s = "bcad" 교환 s [1] 와 s [2], s = "bacd"
예시 2:
입력: s = "dcab", pairs = [0, 3], [1, 2], [0, 2] 출력: "abcd" 해석: 교환 s [0] 와 s [3], s = "bcad" 교환 s [0] 와 s [2], s = "acbd" 교환 s [1] 와 s [2], s = "abcd"
예시 3:
입력: s = "cba", pairs = [0, 1], [1, 2] 출력: "abc" 해석: 교환 s [0] 와 s [1], s = "bca" 교환 s [1] 와 s [2], s = "bac" 교환 s [0] 와 s [1], s = "abc"
알림:
1 <= s.length <= 10^5 0 <= pairs.length <= 10^5 0 <= pairs[i][0], pairs[i][1] s 소문 자 만 들 어 있 습 니 다.
2. 문제 풀이 사고
그리고 집합 을 찾 으 려 면 각 구간 의 최소 색인 과 최대 값 을 찾 아야 합 니 다. 여러 구간 의 시작 점 이 키 값 인 목록 이 나타 날 수 있 습 니 다. 목록 에는 연결 가능 한 노드 가 있 습 니 다.
각 구간 목록 에 대응 하 는 문 자 를 정렬 한 다음 색인 에 대응 하 는 위치 에 놓 습 니 다. 즉, 사전 순서에 따라 가장 작은 문자열 입 니 다.
코드
from collections import defaultdict
class Solution:
    def smallestStringWithSwaps(self, s: str, pairs: list) -> str:
        if len(pairs) == 0:
            return s
        p = [-1 for _ in range(len(s))]

        def find(x):
            if p[x] < 0:
                return x
            return find(p[x])

        def merge(x1, x2):
            if x1 == x2:
                return
            if x1 < x2:
                p[x2] = x1
            else:
                p[x1] = x2

        for pair in pairs:
            x1 = find(pair[0])
            x2 = find(pair[1])
            merge(x1, x2)

        x_dict = defaultdict(list)
        for i in range(len(s)):
            x = find(i)
            x_dict[x].append(i)

        res = ['' for _ in range(len(s))]
        for k, list_v in x_dict.items():
            s_in_list_v = [s[i] for i in list_v]
            s_in_list_v.sort()
            for i in range(len(list_v)):
                res[list_v[i]] = s_in_list_v[i]
        return ''.join(res)


if __name__ == '__main__':
    s = "dcab"
    pairs = [[0,3],[1,2]]
    ss = Solution()
    ans = ss.smallestStringWithSwaps(s, pairs)
    print(ans)


좋은 웹페이지 즐겨찾기