https://school.programmers.co.kr/learn/courses/30/lessons/17685
1. 자동완성 결정방법
1. cnt[node] 배열을 두고,
2. insert하면서 지나갈때마다 cnt[node] +1 하면서 지나간다.
3. cnt가 1이면, 유일한것이다.
2. 의사코드
1. 모두 삽입후 이런 상태가 된다.
2. cur을 내려가면서 (한글자씩 보면서) 1을 찾으면 더 들어가지말고(brak), ret를 리턴하면된다.
int find(string& s){
int ret=0;
int cur=root;
for(auto c : s){
if(cnt[cur]==1) break;
cur=nxt[cur][c-'a'];
ret++;
}
return ret;
}
3. 공간복잡도 : n * 글자수 // 100000 * 10
3. 전체코드
#include <bits/stdc++.h>
int root = 1;
int unused=2;
const int mx=100000 * 10 +5; //!const 해야 배열의 크기로 사용가능!
int nxt[mx][27];
int cnt[mx],chk[mx]; // 중복접두사의 갯수
using namespace std;
void insert(string& s){
int cur=root;
for(auto c : s){
if(nxt[cur][c-'a']==-1){
nxt[cur][c-'a']=unused++;
}
cur=nxt[cur][c-'a'];
cnt[cur]++;
}
chk[cur]=1;
}
int find(string& s){
int ret=0;
int cur=root;
for(auto c : s){
if(cnt[cur]==1) break;
cur=nxt[cur][c-'a'];
ret++;
}
return ret;
}
int solution(vector<string> words) {
int answer = 0;
memset(nxt,-1,sizeof(nxt));
for(auto word : words){
insert(word);
}
for(auto word : words){
answer+=find(word);
cout<<"\n";
}
return answer;
}
'Algorithm > 트라이' 카테고리의 다른 글
리트코드 208. Trie 구현 c++ // 트라이복습, c클래스 초기화 방법 (0) | 2024.05.18 |
---|---|
백준 5670 c++ 휴대폰자판 // 트라이 자식수, 소수점출력방법, mx설정방법 (0) | 2024.05.07 |
프로그래머스 가사검색 c++ // 정석트라이, 단어 길이별 트라이, 접미사 구하는법, 한계 (0) | 2024.05.03 |
백준 5052 전화번호 목록 c++ // 트라이, 서로 접두어검사, 입력값은 모두받아야함 (0) | 2024.05.02 |
백준 5052 접두사 찾기 c++ // 트라이, 접두사검사, 포함검사 (0) | 2024.05.02 |