程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 1015 字典樹,1015字典

1015 字典樹,1015字典

編輯:C++入門知識

1015 字典樹,1015字典


字典樹:顧名思義,是通過字符來查找,不過只是統計以某個字符或字符串為前綴的單詞個數,字典中無此前綴,返回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是個函數,不是個屬性。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved