1. 程式人生 > >Trie字典樹

Trie字典樹

本來刷dp刷得好好的…突然要講…那就學學吧 以下為兩種寫法

桶儲存 : 空間換取時間

深度作為字串長度,每個元素作為一個長度為26的桶,每個的下標代表相應字母的序號,存下一個元素的id

具體實現虛擬碼大概如下

  1. 若當前桶中要存的元素的下標沒有被訪問,ton[u]=++tot,訪問過就往下找 注意:同一深度的桶並無關聯,深度僅說明了他們的長度
void build(int pos)
{
	if(!ton[s[pos]-'a'])
		ton[s[pos]-'a']=++tot;
	build(pos+1);
}
  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;
}
  1. 建好之後就可以根據stop之類的東西來實現一些操作了
  2. 分析一下,空間複雜度(26*Σ\Sigma 1-n Σ\Sigma 1-strlen(s))