leetcode 1202 交換字串中的元素

2021-10-25 22:01:31 字數 1624 閱讀 5838

給你乙個字串 s,以及該字串中的一些「索引對」陣列 pairs,其中 pairs[i] = [a, b] 表示字串中的兩個索引(編號從 0 開始)。

你可以 任意多次交換 在 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.length

s 中只含有小寫英文本母

一:並查集

能夠互相交換的索引,是相互連通的,此集合內的元素都可互相交換。

所以將能夠連通的字元集合存入優先佇列(小根堆)中,或者存入陣列中然後排序

class

solution

//合併

for(

auto

& pair : pairs)

//優先佇列

unordered_map<

int, priority_queue<

char

, vector<

char

>

,greater<

char

>>

> map;

for(

int i=

0; i)for

(int i=

0; i)return s;

}int

find

(vector<

int>

& parent,

int x)

//更新,使x直接指向父節點,parent[x] == root;

while

(parent[x]

!= root)

return root;

}void

merge

(vector<

int>

& parent,

int x,

int y)

};

並查集的妙用 Leetcode 1202

給你乙個字串 s,以及該字串中的一些 索引對 陣列 pairs,其中 pairs i a,b 表示字串中的兩個索引 編號從 0 開始 你可以 任意多次交換 在 pairs 中任意一對索引處的字元。返回在經過若干次交換後,s 可以變成的按字典序最小的字串。示例 1 輸入 s dcab pairs 0,...

1202 交換字串中的元素

1202.交換字串中的元素 給你乙個字串s,以及該字串中的一些 索引對 陣列pairs,其中pairs i a,b 表示字串中的兩個索引 編號從 0 開始 你可以任意多次交換在pairs中任意一對索引處的字元。返回在經過若干次交換後,s可以變成的按字典序最小的字串。示例 1 輸入 s dcab pa...

1202 交換字串中的元素

給你乙個字串 s,以及該字串中的一些 索引對 陣列 pairs,其中 pairs i a,b 表示字串中的兩個索引 編號從 0 開始 你可以 任意多次交換 在 pairs 中任意一對索引處的字元。返回在經過若干次交換後,s 可以變成的按字典序最小的字串。class solution return f...