질문 집합: LeetCode: 1202. 문자열 의 요 소 를 교환 합 니 다.
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 에는 소문 자 영문 자모 만 포함 되 어 있 습 니 다.
문제 풀이 의 사고 방향.
/ / 문제 풀이 방향 은 연 결 된 변 을 하나의 집합 에 넣 고 모든 집합 에 있 는 문 자 를 정렬 하면 가장 작은 사전 순 서 를 얻 을 수 있 습 니 다. /어 려 운 점 은 같은 집합 에 있 는 문 자 를 어떻게 정렬 하고 정렬 한 후에 원래 문자열 을 어떻게 삽입 하 는 지 에 있다.이 문 제 는 Hashmap, char 배열, sb 로 완성 합 니 다.
2 코드 구현
class Solution {
public String smallestStringWithSwaps(String s, List<List<Integer>> pairs) {
DisJU dju = new DisJU(100000 + 5);
// pair
for (List<Integer> list : pairs) {
dju.union(list.get(0), list.get(1));
}
// key, List 。
HashMap<Integer, List<Integer>> hs = new HashMap<>();
for (int i = 0; i < s.length(); ++i) {
int key = dju.find(i);
hs.computeIfAbsent(key, k -> new ArrayList<>()).add(i);// list ,newList add
}
// , sb
StringBuilder sb = new StringBuilder(s);
for (List<Integer> idx_list : hs.values()) {
if (idx_list.size() > 1) {
//mysort char , , 。
mysort(sb, idx_list);
}
}
return sb.toString();
}
private void mysort(StringBuilder sb, List<Integer> idx_list) {
// , char , ,sort ,null , 。
// char[] chars = new char[sb.length()];
// for (int idx:idx_list){
// chars[idx] = sb.charAt(idx);// char idx sb
// }
// Arrays.sort(chars);
// for (int idx:idx_list){
// sb.setCharAt(idx,chars[idx]);
// }
// }
char[] chars = new char[idx_list.size()];
for (int i = 0; i < idx_list.size(); ++i) {
chars[i] = sb.charAt(idx_list.get(i));
}
Arrays.sort(chars);
for (int i = 0; i < idx_list.size(); ++i) {
sb.setCharAt(idx_list.get(i), chars[i]);
}
}
}
class DisJU{
int[] pre;
public DisJU(){
}
public DisJU(int n){
pre = new int[n];
for (int i=0;i<n;++i){
pre[i]=i;
}
}
public int find(int x ){
if (pre[x]==x)return x;
int root = find(pre[x]);
return pre[x]=root;
}
public void union(int a ,int b){
int x = find(a);
int y = find(b);
pre[x]=y;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
비슷한 이름의 Attribute를 많이 만들어 삭제하는 Houdini사용 소프트웨어는 Houdini16.5입니다 배열에서는 애트리뷰트의 보간이 잘 동작하지 않는 것과 AttributeCreateSOP 노드에서 Size가 4를 넘는 애트리뷰트를 작성해도 값이 조작할 수 없어 의미가 없...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.