上接http://blog.csdn.net/u010902721/article/details/45749447
例二
问题:
有一组字符串,这一组字符串中,有没有两个字符串A和B,满足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
}