字典樹:顧名思義,是通過字符來查找,不過只是統計以某個字符或字符串為前綴的單詞個數,字典中無此前綴,返回0;有則返回個數。
創建樹:根據所給字符串,依次遍歷字符串件數,如果存在,num++,查看下一個字符。不存在,建立新的節點,n++,查看下一節點。
直到遍歷完字符串為止。
查看:大體操作和創建一樣,遍歷完字符串,存在返回num,不存在返回0;
這只是一個英文字典查詢,如果為世界所有字符,便會出錯,可以把節點內的child數組變為一個動態數組,然後,和英文字典一樣,不過我還沒弄會,研究中、、、、、、、、、、
源代碼:
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
//創建字典樹節點
typedef struct Trie{
int num;//記錄個數
struct Trie *child[26];//26個字母分支
Trie (){
for(int i=0;i<26;i++){//初始化
child[i]=NULL;
}
}
}Trie;
//創建字典樹
void create(string str,Trie *trie){
Trie *p=trie;
for(int i=0;i<(str.length());i++){
int temp=str[i]-'a';//判斷為那個字符
if(p->child[temp]==NULL){//判斷是否存在
p->child[temp]=new Trie;
}
p=p->child[temp];//根節點不需要總個數,那代表的是整個字典含有的單詞數;故直接連接到字符分支;
p->num ++;
}
}
//根據前綴查找
int check(string str,Trie *trie){
Trie *p=trie;
for(int i=0;i<(str.length());i++){//遍歷所給的字符串
int temp=str[i]-'a';
if(p->child[temp]==NULL){//判斷是否存在,否:0;是:下一個字符;
return 0;
}
p=p->child[temp];
}
return p->num;
}
int main(void){
Trie *trie=new Trie;
int n,m;
string str;
cin>>n;//字典最多含有單詞數
while(n--){
cin>>str;
create(str,trie);
}
cin>>m;//查找單詞數
while(m--){
cin>>str;
cout<<check(str,trie)<<endl;
}
}
注:對c++的一些函數使用不熟悉,str.length();最初寫成了 ‘str.length’;length是個函數,不是個屬性。