각 요소의 길이가 같고 각 요소에 문자 "A", "C", "G" 및/또는 "T"가 포함되어 있는 유전자라는 문자열 목록이 있다고 가정합니다. 이제 몇 가지 규칙이 있습니다 -
-
두 문자열 s1과 s2가 한 문자를 제외하고 동일한 문자열이면 s1과 s2는 동일한 돌연변이 그룹에 있습니다.
-
두 개의 문자열 s1과 s2가 그룹에 있고 s2와 s3이 그룹에 있으면 s1과 s3은 같은 그룹에 있습니다.
생성할 수 있는 돌연변이 그룹의 총 수를 찾아야 합니다.
따라서 입력이 ["ACGT", "ACGC", "ACTT", "TTTT", "TGTT"]와 같은 입력인 경우 두 개의 돌연변이 그룹이 있으므로 출력은 2가 됩니다. ["ACGT", "ACGC", "ACTT"] 및 ["TTTT", "TTTG"]
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
부모라는 하나의 맵 정의
-
getPar() 함수를 정의하면,
-
부모[a]가 다음과 같으면:
-
반환
-
-
부모[a] =getPar(부모[a])
-
부모 반환[a]
-
unite() 함수를 정의하면, b,
-
parA :=getPar(a), parB :=getPar(b)
-
parA가 parB와 같지 않은 경우:
-
부모[parA] :=parB
-
true를 반환
-
-
거짓을 반환
-
ok() 함수를 정의하면, b,
-
cnt :=0
-
초기화 i :=0의 경우, i
-
cnt :=cnt + (a[i]가 b[i]와 같지 않으면 1, 그렇지 않으면 0)
-
-
cnt가 1이면 true를 반환하고, 그렇지 않으면 false를 반환
-
주요 방법에서 다음을 수행하십시오 -
-
배열 v
정렬 -
v
에서 요소를 가져와서 하나의 세트를 정의합니다. -
ret :=v의 크기
-
v의 각 요소에 대해 수행
-
부모[그것] :=그것
-
v의 각 요소에 대해 수행
-
j:=0 초기화의 경우, j <크기일 때 업데이트(j를 1만큼 증가), 수행:
-
임시 :=그것
-
[A, C, G, T]의 각 문자 x에 대해
-
x가 [j]와 같지 않으면:
-
온도[j] :=x
-
temp가 s에 있으면:
-
합치면(temp, it), 다음:
-
-
-
-
리턴 렛
-
-
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
#include <bits/stdc++.h> using namespace std; class Solution { public: map <string, string> parent; string getPar(string& a){ if(parent[a] == a) return a; return parent[a] = getPar(parent[a]); } bool unite(string& a, string& b){ string parA = getPar(a); string parB = getPar(b); if(parA != parB){ parent[parA] = parB; return true; } return false; } bool ok(string &a, string& b){ int cnt = 0; for(int i = 0; i < a.size(); i++){ cnt += a[i] != b[i]; } return cnt == 1; } int solve(vector<string> v) { sort(v.begin(), v.end()); set <string> s(v.begin(), v.end()); int ret = v.size(); for(auto& it : v){ parent[it]= it; } for(auto& it : v){ for(int j = 0; j < it.size(); j++){ string temp = it; for(char x : {'A', 'C', 'G', 'T'}){ if(x != it[j]){ temp[j] = x; if(s.count(temp)){ if(unite(temp, it)) ret--; } } } } } return ret; } }; main(){ vector<string> v = {"ACGT", "ACGC", "ACTT", "TTTT", "TGTT"}; Solution(ob); cout << ob.solve(v); }
입력
{"ACGT", "ACGC", "ACTT", "TTTT", "TGTT"}
출력
2