zoukankan      html  css  js  c++  java
  • 脏字处理思路


     http://www.360coding.com/html/ASP.NET/24071.html

    代码
     using System; 
      
    using System.Collections.Generic; 
      
    using System.Text; 
      
    using System.Text.RegularExpressions; 
      
    using System.IO; 
      
    using System.Collections; 
       
      
    namespace filter 
      { 
       
    class Filter 
       { 
       
    private Hashtable h = new Hashtable(); 
       
       
    public Filter() 
       { 
       
       } 
       
       
    public void Inital(string filename) 
       { 
       
    string[] strs = GetBadwords(filename); 
       
    foreach (string str in strs) 
       { 
       AddBadword(str); 
       } 
       } 
       
       
    private void AddBadword(string str) 
       { 
       
    char c = str[0]; 
       
    if (h.ContainsKey(c)) 
       { 
       TreeNode node 
    = (TreeNode)h[c]; 
       AddNode(node, str, 
    1); 
       } 
       
    else 
       { 
       TreeNode node 
    = new TreeNode(); 
       node.Text 
    = c; 
       
    if (str.Length == 1
       node.Leaf 
    = true
       
    else 
       node.Leaf 
    = false
       
       h.Add(c, node); 
       AddNode(node, str, 
    1); 
       } 
       } 
       
       
    private void AddNode(TreeNode node, string str, int p) 
       { 
       
    if (str.Length > p) 
       { 
       
    if (node.ChildNodes == null
       node.ChildNodes 
    = new Hashtable(); 
       
       TreeNode n; 
       
    if (!node.ChildNodes.ContainsKey(str[p])) 
       { 
       n 
    = new TreeNode(); 
       n.Text 
    = str[p]; 
       
    if (str.Length == p + 1
       n.Leaf 
    = true
       
    else 
       n.Leaf 
    = false
       
       node.ChildNodes.Add(str[p], n); 
       } 
       
    else 
       n 
    = (TreeNode)node.ChildNodes[str[p]]; 
       
       AddNode(n, str, p 
    + 1); 
       } 
       
       } 
       
    public bool Pass(string str) 
       { 
       
    int total, current; 
       total 
    = str.Length; 
       
    for (current = 0; current < total; current++
       { 
       
    if (h.ContainsKey(str[current])) 
       { 
       TreeNode node 
    = (TreeNode)h[str[current]]; 
       
    if (containChar(node, str, current + 1,total)) 
       
    return false
       } 
       } 
       
    return true
       } 
       
       
    private bool containChar(TreeNode node, string str, int p,int total) 
       { 
       
       
    if (node.Leaf == true
       
    return true
       
       
    if (p >= total) 
       
    return false
       
       
    if (node.ChildNodes.ContainsKey(str[p])) 
       { 
       TreeNode n 
    = (TreeNode)node.ChildNodes[str[p]]; 
       
    return containChar(n, str, p + 1, total); 
       } 
       
    else 
       
    return false
       
       } 
       
       
    private string[] GetBadwords(string filename) 
       { 
       List
    <string> list = new List<string>(); 
       
    using (StreamReader sr = new StreamReader(filename, Encoding.Default)) 
       { 
       
    string str = sr.ReadToEnd(); 
       MatchCollection mc 
    = Regex.Matches(str, @"\S+"); 
       
    foreach (Match m in mc) 
       { 
       Console.WriteLine(m.Value); 
       list.Add(m.Value); 
       } 
       } 
       
    return list.ToArray(); 
       } 
       } 
      } 

    代码
    using System; 
      
    using System.Collections.Generic; 
      
    using System.Text; 
      
    using System.Collections; 
       
      
    namespace filter 
      { 
       
    public class TreeNode 
       { 
       
    private Hashtable childNodes; 
       
       
    public Hashtable ChildNodes 
       { 
       
    get { return childNodes; } 
       
    set { childNodes = value; } 
       } 
       
       
       
    private bool leaf; 
       
       
    public bool Leaf 
       { 
       
    get { return leaf; } 
       
    set { leaf = value; } 
       } 
       
    private char text; 
       
       
    public char Text 
       { 
       
    get { return text; } 
       
    set { text = value; } 
       } 
       
       } 
      } 

    http://www.cnblogs.com/SkyD/archive/2009/03/16/updateTextVali.html

    http://www.cnblogs.com/xingd/archive/2008/01/23/1050443.html

    http://www.cnblogs.com/goody9807/archive/2006/09/12/502094.html

    最后小结:

    代码
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Collections;

    namespace Pixysoft
    {
        
    class BadWordHelper
        {
            
    private const char default_split_string = '|';
            
    private const string default_replace_string = "*";

            
    private int maxWordLength = 0;
            
    private int minWordLength = int.MaxValue;

            
    private List<string> hash = new List<string>();//多字检查
            private byte[] fastCheck = new byte[char.MaxValue];//多字检查
            private BitArray charCheck = new BitArray(char.MaxValue);//单字检查


            
    public BadWordHelper(string dictionary)
            {
                
    if (string.IsNullOrEmpty(dictionary))
                    
    throw new Exception("no dictionary founded.");

                
    string[] badwords = dictionary.Split(default_split_string);

                
    foreach (string word in badwords)
                {
                    maxWordLength 
    = Math.Max(maxWordLength, word.Length);

                    minWordLength 
    = Math.Min(minWordLength, word.Length);

                    
    for (int i = 0; i < 7 && i < word.Length; i++)
                    {
                        fastCheck[word[i]] 
    |= (byte)(1 << i);
                    }

                    
    for (int i = 7; i < word.Length; i++)
                    {
                        fastCheck[word[i]] 
    |= 0x80;
                    }

                    
    if (word.Length == 1)
                    {
                        charCheck[word[
    0]] = true;
                    }
                    
    else
                    {
                        hash.Add(word);
                    }
                }
            }

            
    public bool HasBadWord(string text)
            {
                
    if (string.IsNullOrEmpty(text))
                    
    return false;

                
    int index = 0;

                
    while (index < text.Length)
                {

                    
    if ((fastCheck[text[index]] & 1== 0)
                    {
                        
    while (index < text.Length - 1 && (fastCheck[text[++index]] & 1== 0) ;
                    }

                    
    //单字节检测
                    if (minWordLength == 1 && charCheck[text[index]])
                    {
                        
    return true;
                    }

                    
    //多字节检测
                    for (int j = 1; j <= Math.Min(maxWordLength, text.Length - index - 1); j++)
                    {
                        
    //快速排除
                        if ((fastCheck[text[index + j]] & (1 << Math.Min(j, 7))) == 0)
                        {
                            
    break;
                        }
                        
    if (j + 1 >= minWordLength)
                        {
                            
    string sub = text.Substring(index, j + 1);

                            
    if (hash.Contains(sub))
                            {
                                
    return true;
                            }
                        }
                    }
                    index
    ++;
                }
                
    return false;
            }

            
    public string ReplaceBadWord(string text)
            {
                
    int index = 0;

                
    for (index = 0; index < text.Length; index++)
                {
                    
    if ((fastCheck[text[index]] & 1== 0)
                    {
                        
    while (index < text.Length - 1 && (fastCheck[text[++index]] & 1== 0) ;
                    }

                    
    //单字节检测
                    if (minWordLength == 1 && charCheck[text[index]])
                    {
                        text 
    = text.Replace(text[index], default_replace_string[0]);

                        
    continue;
                    }

                    
    //多字节检测
                    for (int j = 1; j <= Math.Min(maxWordLength, text.Length - index - 1); j++)
                    {
                        
    //快速排除
                        if ((fastCheck[text[index + j]] & (1 << Math.Min(j, 7))) == 0)
                        {
                            
    break;
                        }
                        
    if (j + 1 >= minWordLength)
                        {
                            
    string sub = text.Substring(index, j + 1);

                            
    if (hash.Contains(sub))
                            {
                                
    //替换字符操作
                                char cc = default_replace_string[0];
                                
    string rp = default_replace_string.PadRight((j + 1), cc);
                                text 
    = text.Replace(sub, rp);
                                
    //记录新位置
                                index += j;
                                
    break;
                            }
                        }
                    }
                }

                
    return text;
            }
        }
    }
  • 相关阅读:
    CodeForces 383C-dfs序-线段树
    poj-3321-dfs序-线段树-邻接表
    poj2528-Mayor's posters-线段树离散化、基础
    hdu3333-Turing Tree-线段树+离线+离散化
    poj 1151-atlantis-线段树扫描线求面积并
    Changes favor the connective minds.
    HDU 4800/zoj 3735 Josephina and RPG 2013 长沙现场赛J题
    HDU 1203 I NEED A OFFER! 01背包
    hdu 1175 连连看 DFS
    Codeforces Round #208 (Div. 2) 358D Dima and Hares
  • 原文地址:https://www.cnblogs.com/zc22/p/1803589.html
Copyright © 2011-2022 走看看