敏感字过虑,金字塔算法

#ifndef c_find_keyword_h
#define c_find_keyword_h


namespace find_keyword
{
class c_keyword
{
typedef c_keyword* KEYWORD[0XFF+1];
typedef list<string> LWORDS;
public:
c_keyword():m_ending(false), m_depth(0), m_words_crc16(0) {memset(&m_keyword, 0, sizeof(KEYWORD));}
~c_keyword() 
{
for (int i = 0; i < 0xFF + 1; i++)
{
if (m_keyword[i] != NULL)
delete m_keyword[i];
}
}


void result_words(uint16 crc, list<string>& words, uint16& crc16)
{
if (crc == m_words_crc16)
return;


for (LWORDS::iterator pos = m_words.begin(); pos != m_words.end(); ++pos)
{
words.push_back(*pos);
}


crc16 = m_words_crc16;
}


void push(const int8* keyword)
{
return push((uint8*)keyword);
}


void push(const uint8* keyword)
{
if (keyword == NULL) return;


m_words.push_back((char*)keyword);
m_words_crc16 = c_crc::crc16(m_words_crc16, (uint8*)keyword, strlen((char*)keyword));


return p_keyword(keyword, this, 1);
}


void replace(int8* keyword, uint8 ch)
{
for (int i = 0; true; i++)
{
if (keyword[i] == '\0') break;


int pos = key((const uint8*)&keyword[i]);
if (pos > 0) 
{
int8* pkey = &keyword[i];
for (int x = 0; x < pos; x++)
{
pkey[x] = ch;
}


i += pos - 1;
}
}
}


bool findkey(const int8* keyword, int& b, int& p)
{
for (int i = 0; true; i++)
{
if (keyword[i] == '\0') break;


int pos = key((const uint8*)&keyword[i]);
if (pos > 0) 
{
b = i;
p = pos;
return true;
}
}


return false;
}


bool findkey(const int8* keyword)
{
for (int i = 0; true; i++)
{
if (keyword[i] == '\0') break;


int pos = key((const uint8*)&keyword[i]);
if (pos > 0) 
{
return true;
}
}


return false;
}


private:



int key(const uint8* keyword)
{
if (keyword == NULL) return 0;




return f_keyword(keyword, this);
}

void p_keyword(const uint8* keyword, c_keyword* wkey, int depth)
{
if (keyword[0] == '\0') return;


KEYWORD& key = wkey->m_keyword;


if (key[keyword[0]] == NULL)
{
key[keyword[0]] = new c_keyword;
key[keyword[0]]->m_depth = depth;
}


if (keyword[1] == '\0') key[keyword[0]]->m_ending = true;


return p_keyword(keyword + 1, key[keyword[0]], ++depth);
}


int f_keyword(const uint8* keyword, c_keyword* wkey )
{
if (keyword[0] == '\0') return 0;


KEYWORD& key = wkey->m_keyword;


if (key[keyword[0]] == NULL)
return 0;


if (key[keyword[0]]->m_ending)
{
KEYWORD& next_key = key[keyword[0]]->m_keyword;
if (next_key[keyword[1]] == NULL)
return key[keyword[0]]->m_depth;
}


int pos = f_keyword(keyword + 1, key[keyword[0]]);


if (pos == 0 && key[keyword[0]]->m_ending) 
return key[keyword[0]]->m_depth;


return pos;
}


protected:
KEYWORD m_keyword; //树图
bool m_ending; //是否关键字结尾(注: key1:中国  key2:中国人 会产生两个结点)
int m_depth; //深度
LWORDS m_words; //所有关键字
uint16 m_words_crc16; //crc16;
};

}

#endif //c_find_keyword_h


测试:

int main()

{

c_keyword word;

word.push("123");

word.push("891");

word.push("8527");

//查找

if (word.findkey("122112311"))

{

printf("找到了\r\n");

else

{

printf("没找到\r\n");

}


char szTemp[1024];

strcpy(szTemp, "122112311");

//替换

word.replace(szTemp, '*');


return 0;

}

此算法贡献给大家,让大家在开发过程中可以节省时间

欢迎测试使用!如果有写的不好可以发邮件到zensoft@163.com 

转载请注明出处

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值