給你乙個字串 s,以及該字串中的一些「索引對」陣列 pairs,其中 pairs[i] = [a, b] 表示字串中的兩個索引(編號從 0 開始)。
你可以 任意多次交換 在 pairs 中任意一對索引處的字元。
返回在經過若干次交換後,s 可以變成的按字典序最小的字串。
示例 1:
輸入:s = 「dcab」, pairs = [[0,3],[1,2]]示例 2:輸出:「bacd」
解釋:交換 s[0] 和 s[3], s = 「bcad」
交換 s[1] 和 s[2], s = 「bacd」
輸入:s = 「dcab」, pairs = [[0,3],[1,2],[0,2]]示例 3:輸出:「abcd」
解釋:交換 s[0] 和 s[3], s = 「bcad」
交換 s[0] 和 s[2], s = 「acbd」
交換 s[1] 和 s[2], s = 「abcd」
輸入:s = 「cba」, pairs = [[0,1],[1,2]]1 <= s.length <= 10^5輸出:「abc」
解釋:交換 s[0] 和 s[1], s = 「bca」
交換 s[1] 和 s[2], s = 「bac」
交換 s[0] 和 s[1], s = 「abc」
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...