首页 > 编程语言 >DFA算法C#实现

DFA算法C#实现

时间:2022-10-24 14:22:15浏览次数:44  
标签:tmp C# Add int 算法 Hashtable var input DFA

/// <summary>
    /// 过滤词DFA算法实现
    /// </summary>
    public class ForbiddentWordLibrary
    {
        /// <summary>
        /// 用分行过滤词文件来初始化过滤词库
        /// </summary>
        /// <param name="path">文件路径</param>
        public ForbiddentWordLibrary( string path )
        {
            try
            {
                words = new HashSet<string>();
                using( var stream = new StreamReader( path, Encoding.UTF8 ) )
                {
                    while( !stream.EndOfStream )
                    {
                        words.Add( stream.ReadLine().Trim() );
                    }
                }
                InitLibrary();
            }
            catch( Exception ex )
            {
                throw ex;
            }
        }

        /// <summary>
        /// 找到输入字符串内所有敏感词
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public List<string> GetAllForbiddenWords( string input )
        {
            List<string> result = new List<string>();
            for( int i = 0; i < input.Length; i++ )
            {
                int length = SearchFW( input, i );
                if( length > 0 )
                {
                    result.Add( input.Substring( i, length ) );
                    i = i + length - 1;
                }
            }

            return result;
        }

        /// <summary>
        /// 搜索输入的字符串,查找所有敏感词,找到则返回敏感词长度
        /// </summary>
        /// <param name="input">输入字符串</param>
        /// <param name="beginIndex">查找的起始位置</param>
        /// <returns></returns>
        private int SearchFW( string input, int beginIndex )
        {
            bool flag = false;
            int len = 0;
            Hashtable ht = lib;
            for( int i = beginIndex; i < input.Length; i++ )
            {
                var c = input[ i ];
                var obj = ht[ c.ToString() ];
                if( obj == null )
                    break;
                else
                {
                    len++;
                    ht = (Hashtable)obj;
                    if( (int)ht[ "IsEnd" ] == 1 )
                        flag = true;
                }
            }

            if( !flag )
                len = 0;

            return len;
        }

        /// <summary>
        /// 初始化词库结构
        /// </summary>
        private void InitLibrary()
        {
            lib = new Hashtable( words.Count );
            var tmp = lib;
            foreach( string k in words )
            {
                for( int i = 0; i < k.Length; i++ )
                {
                    var c = k[ i ].ToString();
                    if( tmp.ContainsKey( c ) )
                    {
                        tmp = (Hashtable)tmp[ c ];
                    }
                    else
                    {
                        var nht = new Hashtable();
                        nht.Add( "IsEnd", 0 );
                        tmp.Add( c, nht );
                        tmp = nht;
                    }

                    if( i == k.Length - 1 )
                    {
                        if( tmp.ContainsKey( "IsEnd" ) )
                            tmp[ "IsEnd" ] = 1;
                        else
                            tmp.Add( "IsEnd", 1 );
                    }
                }
                tmp = lib;
            }
        }

        /// <summary>
        /// 原始过滤词数据集
        /// </summary>
        private HashSet<string> words;
        /// <summary>
        /// 过滤词库
        /// </summary>
        private Hashtable lib;
    }

 

标签:tmp,C#,Add,int,算法,Hashtable,var,input,DFA
From: https://www.cnblogs.com/fei686868/p/16821311.html

相关文章

  • React核心技术浅析
    1.JSX与虚拟DOM我们从React官方文档开头最基本的一段HelloWorld代码入手:ReactDOM.render(<h1>Hello,world!</h1>,document.getElementById('root'));这段代......
  • cmap 自定义颜色卡
    #渐变色cmap=LinearSegmentedColormap.from_list('white_to_red',['#00FF00','#0000FF','#FFFF00','#FF0000'])#间隔色块cmap=mpl.colors.ListedColormap([......
  • 常用限流算法总结
    一、限流是什么?限流,也称流量控制。是指系统在面临高并发,或者大流量请求的情况下,限制新的请求对系统的访问,从而保证系统的稳定性。限流会导致部分用户请求处理不及时或者被......
  • css 背景渐变
    1.渐变从左到右background:linear-gradient(toright,#000,#fff); 2.渐变从上到下background:linear-gradient(tobottom,#000,#fff); 3.角度渐变(60°)background......
  • el-cascader组件根据最后一级向上找到父级并设置默认值
    vue+ elementUI项目中,el-cascader级联选择器使用频率非常高,一些基本使用方法可以参考elementUI官方文档,本文主要研究当接口只返回最后一级id时,如何向上找出所有父级数据,......
  • unknown directive "real_ip_recursive" in /usr/local/nginx/conf/nginx.conf:91报错
    报错原因real_ip_recursiveon;的开启需要安装nginx模块http_realip_module解决办法重新配置安装nginx./configure--prefix=/usr/local/nginx--with-http_ssl_modu......
  • Java-JVM调优jstack找出最耗cpu的线程&定位问题代码
    Java-JVM调优jstack找出最耗cpu的线程&定位问题代码 https://blog.csdn.net/shasiqq/article/details/109801683   JVM调优jstack找出最耗cpu的线程&定位问题代码......
  • 巡路算法
    比较闲,看了网上的思路后写了一个玩玩publicclassMapManager{privateintmapMaxX=0;privateintmapMaxY=0;privateint[,]mapInfo;//终点......
  • C# 在腾讯的发展
    本文首发我的微信公众号"dotnet跨平台",内容得到大家热烈的欢迎,全文重新发布在博客,欢迎转载,请注明出处..NET主要的开发语言是C#,.NET平台泛指遵循ECMA334C#和EC......
  • c语言转义字符(c语言转义字符是什么意思)
    c语言中转义字符是什么意思转义字符C语言表示字符种特殊形式通常使用转义字符表示ASCII码字符集打印控制字符和特定功能字符用于表示字符常量单撇号(')用于表示字符串常量......