辞書ツリー(Trieツリー)の使い方と例(二)
うわつぎhttp://blog.csdn.net/u010902721/article/details/45749447
例2
質問:
AがBのプレフィックスであることを満たす2つの文字列AとBがあるかどうかの文字列のセットがあります.
分析:
私たちは「abcde」、「abcxy」、「ab」を区別すればいい.nodeでiはflagとして使用され、1はこの文字が挿入された文字列の末尾文字であることを示す.これで「ab」を先に挿入してから「abcde」を挿入すれば見つかります.また、「abcde」を先に挿入し、「ab」を挿入する可能性もあります.新しい文字列を挿入すると、文字列挿入が完了してもノードが新規に作成されていないことがわかり、trueも返されます.
例2
質問:
AがBのプレフィックスであることを満たす2つの文字列AとBがあるかどうかの文字列のセットがあります.
分析:
私たちは「abcde」、「abcxy」、「ab」を区別すればいい.nodeでiはflagとして使用され、1はこの文字が挿入された文字列の末尾文字であることを示す.これで「ab」を先に挿入してから「abcde」を挿入すれば見つかります.また、「abcde」を先に挿入し、「ab」を挿入する可能性もあります.新しい文字列を挿入すると、文字列挿入が完了してもノードが新規に作成されていないことがわかり、trueも返されます.
#include<iostream>
#include<string>
using namespace std;
const int MAX_NUM = 26;
struct trieNode{
int i;// , 1
struct trieNode *next[MAX_NUM];
};
trieNode* CreateTrieNode(){
trieNode *p = new trieNode;
p->i = 0;
for(int i = 0; i < MAX_NUM; i++)
p->next[i] = NULL;
return p;
}
bool InsertTrieTree(trieNode **root, string str){
trieNode *p;
if(*root == NULL){
p = CreateTrieNode();
*root = p;
}
else
p = *root;
int len = str.length();
int k;
for(int i = 0; i < len; i++){
k = str.at(i) - 'a';
if(p->next[k] != NULL){
if(p->next[k]->i == 1 || i+1 == len)//
return true;
}
else
p->next[k] = CreateTrieNode();
p = p->next[k];
}
p->i = 1;//
return false;
}
int main(){
trieNode *root = NULL;
cout << InsertTrieTree(&root, "checking"); //print 0
cout << InsertTrieTree(&root, "check"); //print 1
cout << InsertTrieTree(&root, "for"); //print 0
cout << InsertTrieTree(&root, "checking"); //print 1
cout << InsertTrieTree(&root, "program"); //print 0
cout << InsertTrieTree(&root, "programmer"); //print 1
}