网站大量收购独家精品文档,联系QQ:2885784924

DFA有限状态自动机的.ppt

  1. 1、本文档共40页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
DFA有限状态自动机的

字符串模式匹配中DFA的应用;POJ1204 Word Puzzles;将问题抽象;思考…;确定性有限状态自动机DFA(deterministic finite automata) ;确定性有限状态自动机; 单词前缀树(trie);单词前缀树(trie);Trie树用途例子:如何求字符串的所有不同子串;单词前缀树(trie);前缀指针;如何高效的构造前缀指针;如何高效的构造前缀指针;如何在建立好的DFA上遍历;回到原问题;回到原问题;最纯粹的Trie图题目;#include iostream #include vector #include queue using namespace std; #define LETTERS 26 int nNodesCount = 0; struct CNode { CNode * pChilds[LETTERS]; CNode * pPrev; bool bStopNode; //是否是终止节点(危险节点) void Init() { memset(pChilds,0,sizeof(pChilds)); bStopNode = false; pPrev = NULL; } }; CNode Tree[200]; //10个模式串,每个10个字符,每个字符一个节点,也只要100个节点;void Insert( CNode * pRoot, char * s) { for( int i = 0; s[i]; i ++ ) { if( pRoot-pChilds[s[i]-a] == NULL) { pRoot-pChilds[s[i]-a] = Tree + nNodesCount; nNodesCount ++; } pRoot = pRoot-pChilds[s[i]-a]; } pRoot-bStopNode = true; };void BuildDfa( ) { for( int i = 0;i LETTERS ;i ++ ) Tree[0].pChilds[i] = Tree + 1; Tree[0].pPrev = NULL; Tree[1].pPrev = Tree; dequeCNode * q; q.push_back(Tree+1); while( ! q.empty() ){ CNode * pRoot = q.front(); q.pop_front();; for( int i = 0; i LETTERS ; i ++ ) { CNode * p = pRoot-pChilds[i]; if( p) { CNode * pPrev = pRoot-pPrev; while( pPrev ) { if( pPrev-pChilds[i] ) { p-pPrev = pPrev-pChilds[i]; if( p-pPrev-bStopNode ) p-bStopNode = true; //自己的pPrev指向的节点是危险节点,则自己也是危险节点 break; } else pPrev = pPrev-pPrev; } q.push_back(p); } } } //对应于while( ! q.empty() ) };bool SearchDfa(char * s) { CNode * p = Tree + 1; for( int i = 0; s[i] ;i ++ ) { while(true) { if( p-pChilds[s[i]-a]) { p = p-pChilds[s[i]-a]; if( p-bStopNode ) return true; break; } else p = p-pPrev; } } return false; };int main() { nNodesCount = 2; int M,N; scanf(%d%d,N,M); //N个模式串,M个句子 for( int i = 0;i N; i ++ ) { char s[20]; scanf(%s,s); Insert(Tree + 1,s); } BuildDfa(); for( int i = 0 ;i M;i ++ ) { char s[200]; scanf(%s,s); co

文档评论(0)

ayangjiayu3 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档