题目描述:
给你一个字符串 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.字典序最小:
算法分析
算法步骤
Java代码
import java.util.*;
public class smallestStringWithSwaps {
public static String process(String s, List<List<Integer>> pairs) {
if(pairs.size()==0)
{
return s;
}
//第一步:将任意交换的结点对输入并查集
int len = s.length();
UnionFind unionFind = new UnionFind(len);
for(List<Integer> pair:pairs)
{
int index1 = pair.get(0);
int index2 = pair.get(1);
unionFind.union(index1, index2);
}
//第二步:构建映射关系
char[] charArray = s.toCharArray();
Map<Integer,PriorityQueue<Character>> hashMap = new HashMap<>(len);
for(int i = 0;i<len;i++)
{
int root = unionFind.find(i);
if(hashMap.containsKey(root))
{
hashMap.get(root).offer(charArray[i]);
}else {
PriorityQueue<Character> minHeap = new PriorityQueue<>();
minHeap.offer(charArray[i]);
hashMap.put(root, minHeap);
}
}
//第三步:重组字符串
StringBuilder stringBuilder = new StringBuilder();
for(int i = 0 ;i<len;i++)
{
int root = unionFind.find(i);
stringBuilder.append(hashMap.get(root).poll());
}
return stringBuilder.toString();
}
// 并查集
public static class UnionFind{
private int[] parent;
public UnionFind(int n)
{
this .parent = new int[n];
for(int i = 0;i<n;i++)
{
parent[i] = i;
}
}
public void union(int x,int y)
{
if(find(x)==find(y))
return;
parent[find(x)] = find(y);
}
public int find(int i)
{
if(i==parent[i])
return i;
return parent[i] = find(parent[i]);
}
}
//测试
public static void main(String[] args) {
String s = "dcab";
List<List<Integer>> pairs = new ArrayList<List<Integer>>();
List<Integer> list1 = new ArrayList<Integer>();
List<Integer> list2 = new ArrayList<Integer>();
list1.add(0);
list1.add(3);
list2.add(1);
list2.add(2);
pairs.add(list1);
pairs.add(list2);
String string = process(s,pairs);
System.out.println(string);
}
}
时间复杂度
总结