KMP算法 的C#实现,初级版本

static void Main(string[] args)
{
#region 随机字符
StringBuilder sb = new StringBuilder();
string S = "ABCDEFJHIJKLMNOPQRSTUVWXYZ0123456789";
Random r = new Random();
for (int f = ; f < ; f++)
{
if (f % == )
{
sb.Append("AABCDAABCD");
}
else
{
sb.Append(S.Substring(r.Next(, S.Length - ), ));
} }
string sourceStr = sb.ToString();
Console.WriteLine("待匹配的字符长度为:" + sourceStr.Length);
#endregion
Console.WriteLine("start");
Stopwatch sw = new Stopwatch();
sw.Start();
string ostr = "AABCDAABCD";//目标字符
/*
找到对应位置的最大移动长度
*/
Dictionary<int, int> dic = GetMaxMoveLength(ostr);
int success = ;
for (int i = ; i < sourceStr.Length; i++)
{
int j = ;
while (j < ostr.Length && i + j < sourceStr.Length && ostr[j] == sourceStr[i + j])
{
j++;
}
if (j == ostr.Length)
{
success++;
}
i += j;
}
sw.Stop();
Console.WriteLine("成功" + success+"个");
Console.WriteLine("时间:"+sw.ElapsedMilliseconds+"毫秒");
Console.WriteLine("End");
Console.ReadKey();
}
static Dictionary<int, int> GetMaxMoveLength(string ostr)
{
Dictionary<int, int> CanMoved = new Dictionary<int, int>();
for (int i = ; i < ostr.Length; i++)
{
List<string> q = new List<string>();
List<string> h = new List<string>();
string tempstr = ostr.Substring(, i + );
for (int j = ; j < tempstr.Length; j++)
{
q.Add(tempstr.Substring(, j));
}
for (int j = tempstr.Length - ; j > ; j--)
{
h.Add(tempstr.Substring(j, tempstr.Length - j));
}
//获取该位置的最大长度
IEnumerable<string> keys = q.Intersect(h);
int movelength = ;
foreach (string s in keys)
{
if (s.Length > movelength)
{
movelength = s.Length;
}
}
CanMoved.Add(i, i-movelength);
}
return CanMoved;
}

在42万5000个字符中匹配到25000个目标字符用时10毫秒

KMP算法 C#实现 字符串查找简单实现的更多相关文章

  1. KMP算法,匹配字符串模板(返回下标)

    //KMP算法,匹配字符串模板 void getNext(int[] next, String t) { int n = next.length; for (int i = 1, j = 0; i & ...

  2. KMP算法与传统字符串寻找算法

    原理:KMP算法是一种模板匹配算法,它首先对模板进行便利,对于模板中与模板首字符一样和首字符进行标志-1,对于模板匹配中出现不匹配的若是第一轮检查标志为0,若不是第一轮检查标志为该元素与标志为-1的距 ...

  3. 算法之暴力破解和kmp算法 判断A字符串是否包含B字符串

    我们都知道java中有封装好的方法,用来比较A字符串是否包含B字符串 如下代码,contains,用法是 str1.contains(str2), 这个布尔型返回,存在返回true,不存在返回fals ...

  4. kmp算法,求重复字符串

    public class Demo { public static void main(String[] args) { String s1 = "ADBCFHABESCACDABCDABC ...

  5. kmp算法原理与应用(简单易懂)

  6. KMP算法——字符匹配

     暴力匹配: 假设现在我们面临这样一个问题:有一个文本串S,和一个模式串P,现在要查找P在S中的位置,怎么查找呢? 如果用暴力匹配的思路,并假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置, ...

  7. 回朔法/KMP算法-查找字符串

    回朔法:在字符串查找的时候最容易想到的是暴力查找,也就是回朔法.其思路是将要寻找的串的每个字符取出,然后按顺序在源串中查找,如果找到则返回true,否则源串索引向后移动一位,再重复查找,直到找到返回t ...

  8. 字符串匹配算法之kmp算法

    kmp算法是一种效率非常高的字符串匹配算法,是由Knuth,Morris,Pratt共同提出的模式匹配算法,所以简称KMP算法 算法思想 在一个字符串中查找另一个字符串时,会遇到如下图的情况 我们通常 ...

  9. 算法-最通俗易懂的KMP算法详解

    有些算法,适合从它产生的动机,如何设计与解决问题这样正向地去介绍.但KMP算法真的不适合这样去学.最好的办法是先搞清楚它所用的数据结构是什么,再搞清楚怎么用,最后为什么的问题就会有恍然大悟的感觉.我试 ...

随机推荐

  1. js的replace函数把"$"替换成成"\$"

    var aa = 18$    转换成   aa = 18\$ aa.replace("\$","\\\$");    注意JS的replace方法只能替换第一 ...

  2. 微信小程序button授权页面,用户拒绝后仍可再次授权

    微信小程序授权页面,进入小程序如果没授权跳转到授权页面,授权后跳转到首页,如果用户点拒绝下次进入小程序还是能跳转到授权页面,授权页面如下 app.js  中的 onLaunch或onShow中加如下代 ...

  3. 解决webstromm标签高亮问题

      2017/2016版  

  4. 简单探讨弹性布局flex

    css 弹性布局: 盒子模型: box-sizing属性1.content-box 正常的普通的盒子模型用padding和border会使盒子变大:(向外扩张)2.border-box 盒子模型,pa ...

  5. (转)淘淘商城系列——发布dubbo服务

    http://blog.csdn.net/yerenyuan_pku/article/details/72758639 Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入, ...

  6. WPS 常用操作

    1.WPS屏保太美了,如何保存 网上搜到如下资料,发现可以在电脑中找到若干个被缓存的图片,kwallpaper可能为kscreensaver

  7. 安装钩子 SetWindowsHookE

    SetWindowsHookEx 函数将应用程序定义的钩子安装到一个钩链.要将安装一个钩子来监测系统的某些类型的事件.这些事件是与特定的线程或所有线程中调用线程作为同一桌面相关联. Syntax HH ...

  8. 【BIEE】新建用户,并且赋予组BIconsumer,访问BIpublisher报表报错:检索数据xml时出错

    问题描述 今天新建一个用户用户查看报表,并且赋予该用户属于BIConsumer组,但是在访问报表的时候出现以下两个错: 1.xdo格式类的报表 2.RTF模板制作的报表 解决方案: 出现这个问题的原因 ...

  9. java “==”和“equals”

    菜呀,只能记笔记了 ==:如果是基本数据类型,比较值,如果是引用类型,比较地址 equals:比较值

  10. 洛谷——P2055 [ZJOI2009]假期的宿舍

    P2055 [ZJOI2009]假期的宿舍 学校放假了 · · · · · · 有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题.比如 A 和 B 都是学校的学生,A 要回家,而 ...