全文关键字检索-KMP改进算法

正则可以实现关键字查找,但效率很低。就把KMP稍微修改,实现一个效率还比较好的KMP关键字查找算法。c#实现的。话不多说,贴代码。

//获取next public static int[] GetKmpNext(string pattern) { int[] next = new int[pattern.Length]; next[0] = -1; if (pattern.Length < 2) return next; next[1] = 0; int i = 2, j = 0; while (i < pattern.Length) { if (pattern[i - 1] == pattern[j]) { next[i++] = ++j; } else { j = next[j]; if (j == -1) { next[i++] = ++j; } } } return next; } /// <summary> /// 查询关键字方法 /// </summary> /// <param name="source">原字符串</param> /// <param name="keywords">关键字列表用|分开</param> /// <returns>如果存在关键字返回true,反之返回false。</returns> public static bool SearchKeywords(string source, string[] keywords) { int wordCount = keywords.Length; int[][] nexts = new int[wordCount][]; int i = 0; for (i = 0; i < wordCount; i++) { nexts[i] = GetKmpNext(keywords[i]); } i = 0; int[] j = new int[nexts.Length]; while (i < source.Length) { for (int k = 0; k < wordCount; k++) { if (source[i] == keywords[k][j[k]]) { j[k]++; } else { j[k] = nexts[k][j[k]]; if (j[k] == -1) { j[k]++; } } if (j[k] >= keywords[k].Length) { return true; } } i++; } return false; } //测试方法 public static void Test() { string[] keywords = "aa|bb|cc|dd|dddd|销售|报价|ee".Split("|".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); string source = "测试这个adfedajk;ifn/"bb/"fdarew"; Console.WriteLine(SearchKeywords(source,keywords)); }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值