문자열을 효율적이게 저장하고 탐색하는 트리 형태의 자료구조
문자열의 문자 순서대로 자식노드를 생성하는 방식이다
구조
struct Trie {
Trie *node[26];
Trie() {
for (int i = 0; i < 26; i++) node[i] = NULL;
}
~Trie() {
for (int i = 0; i < 26; i++) {
if (node[i]) {
delete node[i];
}
}
}
void insert(string &str, int idx) {
if (idx == str.size()) return; // 문자열 끝까지 탐색 시 종료
if (node[str[idx] - 'a'] == NULL) node[str[idx] - 'a'] = new Trie(); // 해당 문자 노드가 없으면 추가
node[str[idx] - 'a']->insert(str, idx + 1);
}
bool find(string &str, int idx) {
if (idx == str.size()) return true; // 문자열 끝까지 탐색 시 true 리턴
if (node[str[idx] - 'a'] == NULL) return false; // 해당 문자 노드가 없으면 false 리턴
return node[str[idx] - 'a']->find(str, idx + 1);
}
};
사용
Trie *root = new Trie(); // 처음에 루트 노드를 생성
string str;
for (int i = 0; i < N; i++) { // 문자열 추가
cin >> str;
root->insert(str, 0);
}
int res = 0;
for (int i = 0; i < M; i++) { // 문자열 찾기
cin >> str;
if (root->find(str, 0)) res++;
}
delete root; // Trie 사용이 끝난 후 root노드를 해제하면 struct에 선언한 코드에 의해 모두 해제됨
반응형
'Problem solving > Algorithm' 카테고리의 다른 글
문자열 검색 알고리즘 (KMP) (0) | 2023.08.04 |
---|---|
누적합과 구간합 알고리즘 (0) | 2023.07.31 |
위상 정렬 (Topology Sort) (0) | 2023.07.24 |
최소 스패닝 트리 알고리즘 (크루스칼, 프림) (0) | 2023.07.21 |