字典樹

題目鏈接:點擊打開鏈接

代碼:

#include<iostream>
#include<cstring>
using namespace std;

struct T{
	int num;
	T* next[26];
//構造函數 初始化 後面定義的根節點  定以後直接就已經被初始化 
	T()
	{
		num=0;
		for(int i=0;i<26;i++)
		{
			next[i]=NULL;
		}
	}
}r;
void insert(char s[])
{
	T* p=&r;
	int k=strlen(s);
	for(int i=0;i<k;i++)
	{
		int a=s[i]-'a';
	//	如果在當前位的下一個a位是空的 那麼就再初始化一個 
	//	並把初始化得到的空位賦到a位置 
		if(p->next[a]==NULL)
		{
			p->next[a]=new T();
		}
	//	是空 說明後者字符串長度大於等於前者
	//	不是空 說明繼續往下走或後者長度小於後者
	//	無論如何都得賦值 並且瀏覽數加一 
		p=p->next[a];
		p->num++;	
	}
}
int find(char s[])
{
	T* p=&r;
	for(int i=0;i<strlen(s);i++)
	{
		int a=s[i]-'a'; 
	//	如果在當前位的下一個a位是空的 說明不存在以此串開頭的字符串 
		if(p->next[a]==NULL)
		{
			return 0;
		}
		p=p->next[a];
	}
	return p->num;
}

int main()
{
	int n,m;
	
	cin>>n;
	while(n--)
	{
		char s[15];
		cin>>s;
		insert(s);
	}
	
	cin>>m;
	while(m--)
	{
		char s[15];
		cin>>s;
		cout<<find(s)<<endl;
	}
	return 0;
}


發佈了63 篇原創文章 · 獲贊 16 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章