DFA算法以及ios中OC实现DFA
DFA不同于苹果手机的idfa
DFA全称为:Deterministic Finite Automaton,即确定有穷自动机。其特征为:有一个有限状态集合和一些从一个状态通向另一个状态的边,每条边上标记有一个符号,其中一个状态是初态,某些状态是终态。但不同于不确定的有限自动机,DFA中不会有从同一状态出发的两条边标志有相同的符号。
ios oc 代码如下
#import "WordFilter.h"
#define EXIST @"isExists"
@interface WordFilter()
@property (nonatomic,strong) NSMutableDictionary *root;
@property (nonatomic,assign) BOOL isFilterClose;
@end
@implementation WordFilter
static WordFilter *instance;
+ (instancetype)sharedInstance{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[self alloc]init];
});
return instance;
}
- (void)initFilter:(NSString *)filepath{
self.root = [NSMutableDictionary dictionary];
char word[1024];
FILE *fp;
char *p;
//打开文件
fp = fopen([filepath UTF8String], "r");
//按行读取内容
while (fgets(word, sizeof(word), fp)) {
p = word;
while (*p != 0) {
if (*p == '\r' || *p == '\n' || *p == ' ') {
*p = 0;
break;
}
p++;
}
//插入字符,构造节点
[self insertWords:[NSString stringWithUTF8String:word]];
}
}
-(void)insertWords:(NSString *)words{
NSMutableDictionary *node = self.root;
for (int i = 0; i < words.length; i ++) {
NSString *word = [words substringWithRange:NSMakeRange(i, 1)];
if (node[word] == nil) {
node[word] = [NSMutableDictionary dictionary];
}
node = node[word];
}
//敏感词最后一个字符标识
node[EXIST] = [NSNumber numberWithInt:1];
}
- (NSString *)filter:(NSString *)str{
if (self.isFilterClose || !self.root) {
return str;
}
NSMutableString *result = result = [str mutableCopy];
for (int i = 0; i < str.length; i ++) {
NSString *subString = [str substringFromIndex:i];
NSMutableDictionary *node = [self.root mutableCopy] ;
int num = 0;
for (int j = 0; j < subString.length; j ++) {
NSString *word = [subString substringWithRange:NSMakeRange(j, 1)];
if (node[word] == nil) {
break;
}else{
num ++;
node = node[word];
}
//敏感词匹配成功
if ([node[EXIST]integerValue] == 1) {
NSMutableString *symbolStr = [NSMutableString string];
for (int k = 0; k < num; k ++) {
[symbolStr appendString:@"*"];
}
[result replaceCharactersInRange:NSMakeRange(i, num) withString:symbolStr];
i += j;
break;
}
}
}
return result;
}
- (void)freeFilter{
self.root = nil;
}
- (void)stopFilter:(BOOL)b{
self.isFilterClose = b;
}
参考链接:
https://www.cnblogs.com/myvic/p/8671991.html
https://blog.csdn.net/Jali_li/article/details/52843576(代码主要是这个亲的,赞一个)
DFA算法以及ios中OC实现DFA的更多相关文章
- iOS中OC给Category加入属性
引: 非常多人知道能够用Category给已有的类加入一些新方法,可是不同于swift中的extension,Objective-C中的Category(类别)是不支持直接加入属性的.那假设就是须要加 ...
- DFA算法之内容敏感词过滤
DFA 算法是通过提前构造出一个 树状查找结构,之后根据输入在该树状结构中就可以进行非常高效的查找. 设我们有一个敏感词库,词酷中的词汇为:我爱你我爱他我爱她我爱你呀我爱他呀我爱她呀我爱她啊 那么就可 ...
- java实现敏感词过滤(DFA算法)
小Alan在最近的开发中遇到了敏感词过滤,便去网上查阅了很多敏感词过滤的资料,在这里也和大家分享一下自己的理解. 敏感词过滤应该是不用给大家过多的解释吧?讲白了就是你在项目中输入某些字(比如输入xxo ...
- 在IOS中使用DES算法对Sqlite数据库进行内容加密存储并读取解密
在IOS中使用DES算法对Sqlite 数据库进行内容加密存储并读取解密 涉及知识点: 1.DES加密算法: 2.OC对Sqlite数据库的读写: 3.IOS APP文件存储的两种方式及读取方式. 以 ...
- Java过滤敏感词语/词汇---DFA算法
最近网站需要在评论.投稿等地方过滤敏感词汇,于是在网上查找了相关教程,特此整理分享. 关于DFA算法,详细的可以去http://blog.csdn.net/u013378306/article/det ...
- 使用DFA算法对敏感词进行过滤
项目目录结构如下: 其中resources资源目录中: stopwd.txt :停顿词,匹配时间直接过滤. wd.txt:敏感词库. 1.WordFilter敏感词过滤类: package com.s ...
- DFA算法的简单说明!
1.DFA算法简介 DFA全称为:Deterministic Finite Automaton,即确定有穷自动机.其特征为:有一个有限状态集合和一些从一个状态通向另一个状态的边,每条边上标记有一个符号 ...
- Java实现敏感词过滤 - DFA算法
Java实现DFA算法进行敏感词过滤 封装工具类如下: 使用前需对敏感词库进行初始化: SensitiveWordUtil.init(sensitiveWordSet); package cn.swf ...
- 敏感词汇过滤DFA算法
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Tex ...
随机推荐
- python 基于detectron或mask_rcnn的mask遮罩区域进行图片截取
基于示例infer_simple.py 修改165行vis_utils.vis_one_image为vis_utils.vis_one_image_opencv 在detectron.utils.vi ...
- DockerScan:Docker安全分析&测试工具
DockerScan:Docker安全分析&测试工具 今天给大家介绍的是一款名叫DockerScan的工具,我们可以用它来对Docker进行安全分析或者安全测试. 项目主页 http://gi ...
- 2.(基础)tornado的请求与响应
之前我们介绍了tornado 的基础流程,但是还遗留了一些问题,今天我们就来解决这些遗留问题并学习新的内容 settings,使用tornado.web.Application(handler, ** ...
- PXE自动化部署
PXE 预启动执行环境,基于tftp条件下完成基于网络的自动化部署软件 原理: 网卡利用自身的tftp 请求dhcp 服务器获取ip和一个pxelinux.0的地址 在给定的tftp目录下存有ks的配 ...
- [易学易懂系列|rustlang语言|零基础|快速入门|(16)|代码组织与模块化]
[易学易懂系列|rustlang语言|零基础|快速入门|(16)|代码组织与模块化] 实用知识 代码组织与模块化 我们知道,在现代软件开发的过程中,代码组织和模块化是应对复杂性的一种方式. 今天我们来 ...
- 高性能mysql 第4章 Schema与数据类型优化
基本原则: 更小的通常更好:占用更少的磁盘 内存和cpu缓存.如varchar(2)和varchar(100). 简单就好:比如整形比字符型代价更低.使用日期型来存储日期而不是字符串.使用整形存储ip ...
- Gym - 101908H Police Hypothesis (树链剖分/LCT+字符串哈希)
题意:有一棵树,树上每个结点上有一个字母,有两种操作: 1)询问树上两点u,v间有向路径上有多少个字母和某个固定的字符串相匹配 2)将结点u的字母修改为x 树剖+线段,暴力维护前缀和后缀哈希值(正反都 ...
- Phaserjs3 对象池随机产生炸弹并销毁 -- Html网页游戏开发
scene.js /// <reference path="../../libs/phaser/phaser.min.js"/> 'use strict'; var B ...
- 一个简单的c++类的定义和实例化
#include "iostream" #include <string> using namespace std; class mycoach { private: ...
- 开始PHP,常量/变量与内存间的关系--传值
一.常见的PHP代码嵌入式方式,与html结合 要注意:文件名后缀必须形如xxx.php否则html将无法解析 二.php脱离html代码独立工作,没有其他代码 不需要借助Apache工作,只需要ph ...