Trie字典樹
阿新 • • 發佈:2018-12-16
本來刷dp刷得好好的…突然要講…那就學學吧 以下為兩種寫法
桶儲存 : 空間換取時間
深度作為字串長度,每個元素作為一個長度為26的桶,每個的下標代表相應字母的序號,存下一個元素的id
具體實現虛擬碼大概如下
- 若當前桶中要存的元素的下標沒有被訪問,ton[u]=++tot,訪問過就往下找 注意:同一深度的桶並無關聯,深度僅說明了他們的長度
void build(int pos)
{
if(!ton[s[pos]-'a'])
ton[s[pos]-'a']=++tot;
build(pos+1);
}
- 如果串結束了,就對他的id打個標記
void build(int dep,int pos) { if(!id[dep][s[pos]-'a']) ton[++tot][s[pos]-'a']=tot+1, id[dep][s[pos]-'a']=tot; if(s[pos+1]) build(dep+1,pos+1); stop[tot]++; return; }
- 建好之後就可以根據stop之類的東西來實現一些操作了
- 分析一下,空間複雜度(26* 1-n 1-strlen(s))